Pourquoi est-ce QString à const char * conversion produisant un identifiant Debian sur Windows?
Question
Je suis en train d'envelopper libssh2 dans Qt, et ont le code suivant:
const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();
Le problème est que le nom d'utilisateur et mot de passe ne se connecte pas au système. Pourquoi?
Parce que, selon le débogueur,
username "5.1p1 Debian-6ubuntu2"
password "5.1p1 Debian-6ubuntu2"
Ce ne sont pas les valeurs que j'ai donné le nom d'utilisateur ou mot de passe. J'ai essayé ToAscii, toLatin1 et annexant (ou non) le .data (). Pourtant, je reçois ces valeurs, au lieu des valeurs attendues. Je suis sous Windows, ce qui est pourquoi il est encore plus troublant, car, pour autant que je peux dire, rien que j'ai été compilé sur Debian ou Ubuntu.
Qu'est-ce qui se passe ici?
La solution
Ce code:
const char* username = inUsername.toLocal8Bit().data();
est équivalent à ceci:
const char * username;
{
const QByteArray l8b = inUsername.toLocal8Bit();
username = l8b.data();
}
Est-ce que vous voyez ce qui se passe? Au moment où la déclaration a exécuté, le QByteArray
temporaire a été supprimé par le compilateur à nouveau. Depuis data()
renvoie seulement un pointeur vers le tampon de QByteArray
interne, username
maintenant des points à supprimer / mémoire libérée.
Pour résoudre le problème, faire username
et password
QByteArray
s au lieu de const char*
s, et l'utilisation username.data()
, password.data()
au lieu où vous avez utilisé username
, password
avant.