streng - Hvorfor er denne QString til const char * -konvertering, der producerer en Debian-identifikator på Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at pakke libssh2 i Qt, og har følgende kode:


const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();


Problemet er, at brugernavn og adgangskode ikke tilslutter systemet. Hvorfor?


Fordi ifølge debuggeren,


username  "5.1p1 Debian-6ubuntu2"
password  "5.1p1 Debian-6ubuntu2"


Det er ikke de værdier jeg har givet til brugernavnet eller adgangskoden. Jeg har forsøgt atAscii, toLatin1, og tilføjer (eller ej) .data (). Alligevel får jeg disse værdier i stedet for de forventede værdier. Jeg er på Windows, hvorfor det er endnu mere foruroligende, for så vidt jeg kan fortælle, er ikke noget, jeg har samlet på Debian eller Ubuntu.


Hvad sker der her?

Bedste reference


Denne kode:


const char* username = inUsername.toLocal8Bit().data();


svarer til dette:


const char * username;
{
    const QByteArray l8b = inUsername.toLocal8Bit();
    username = l8b.data();
}


Kan du se, hvad der foregår? Når udsagnet er udført, er den midlertidige QByteArray slettet af kompilatoren igen. Da data() kun returnerer en pointer til det interne QByteArray buffer, username peger nu på slettet/frigivet hukommelse.


For at løse problemet skal du lave username og password QByteArray s i stedet for const char* s og bruge username.data(), password.data() i stedet for hvor du brugte [[username, password før.