Por que essa conversão de QString para const char * produz um identificador Debian no Windows?
Pergunta
Estou tentando encapsular libssh2 em Qt e tenho o seguinte código:
const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();
O problema é que esse nome de usuário e senha não se conectam ao sistema.Por quê?
Porque, de acordo com o depurador,
username "5.1p1 Debian-6ubuntu2"
password "5.1p1 Debian-6ubuntu2"
Esses não são os valores que dei para o nome de usuário ou senha.Eu tentei oAscii, toLatin1 e anexar (ou não) o .data ().Ainda assim, recebo esses valores, em vez dos valores esperados.Estou no Windows, e é por isso que é ainda mais preocupante, já que, pelo que posso dizer, nada do que tenho foi compilado no Debian ou Ubuntu.
O que está acontecendo aqui?
Solução
Este código:
const char* username = inUsername.toLocal8Bit().data();
é equivalente a este:
const char * username;
{
const QByteArray l8b = inUsername.toLocal8Bit();
username = l8b.data();
}
Você vê o que está acontecendo?No momento em que a instrução foi executada, o QByteArray
temporário foi excluído pelo compilador novamente.Como data()
retorna apenas um ponteiro para o buffer interno QByteArray
, username
agora aponta para memória excluída / liberada.
Para resolver o problema, crie username
e password
QByteArray
s em vez de const char*
s e use username.data()
, password.data()
em vez de onde você usou username
, password
antes.