Warum erzeugt diese Konvertierung von QString in const char * unter Windows eine Debian-Kennung?
Frage
Ich versuche, libssh2 in Qt zu verpacken und habe den folgenden Code:
const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();
Problem ist, dass Benutzername und Passwort keine Verbindung zum System herstellen.Warum?
Weil laut Debugger
username "5.1p1 Debian-6ubuntu2"
password "5.1p1 Debian-6ubuntu2"
Dies sind nicht die Werte, die ich für den Benutzernamen oder das Passwort angegeben habe.Ich habe versucht, toAscii, toLatin1 und die .data () anzuhängen (oder nicht).Trotzdem erhalte ich diese Werte anstelle der erwarteten Werte.Ich bin unter Windows, weshalb es noch beunruhigender ist, da, soweit ich das beurteilen kann, nichts, was ich habe, unter Debian oder Ubuntu kompiliert wurde.
Was ist hier los?
Lösung
Dieser Code:
const char* username = inUsername.toLocal8Bit().data();
entspricht:
const char * username;
{
const QByteArray l8b = inUsername.toLocal8Bit();
username = l8b.data();
}
Sehen Sie, was los ist?Zum Zeitpunkt der Ausführung der Anweisung wurde der temporäre QByteArray
vom Compiler erneut gelöscht.Da data()
nur einen Zeiger auf den internen QByteArray
-Puffer zurückgibt, zeigt username
jetzt auf gelöschten / freigegebenen Speicher.
Um das Problem zu lösen, erstellen Sie username
und password
QByteArray
s anstelle von const char*
s und verwenden Sie username.data()
, password.data()
, wo Sie zuvor username
, password
verwendet haben.