¿Por qué esta conversión de QString a const char* produce un identificador de Debian en Windows?
Pregunta
Estoy intentando empaquetar libssh2 en Qt y tengo el siguiente código:
const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();
El problema es que ese nombre de usuario y contraseña no se conectan al sistema.¿Por qué?
Porque, según el depurador,
username "5.1p1 Debian-6ubuntu2"
password "5.1p1 Debian-6ubuntu2"
Esos no son los valores que he dado para el nombre de usuario o la contraseña.Intenté toAscii, toLatin1 y agregué (o no) el .data().Aún así, obtengo estos valores, en lugar de los valores esperados.Estoy en Windows, por lo que es aún más preocupante, ya que, hasta donde sé, nada de lo que tengo fue compilado en Debian o Ubuntu.
¿Que está pasando aqui?
Solución
Este código:
const char* username = inUsername.toLocal8Bit().data();
es equivalente a esto:
const char * username;
{
const QByteArray l8b = inUsername.toLocal8Bit();
username = l8b.data();
}
¿Ves lo que está pasando?Para cuando la declaración se haya ejecutado, el temporal QByteArray
El compilador lo ha eliminado nuevamente.Desde data()
sólo devuelve un puntero al interno QByteArray
buffer, username
ahora apunta a la memoria eliminada/liberada.
Para resolver el problema, haga username
y password
QByteArray
s en lugar de const char*
s, y uso username.data()
, password.data()
en lugar de donde usaste username
, password
antes.