Por que essa conversão de QString para const char * produz um identificador Debian no Windows?

StackOverflow https://stackoverflow.com/questions/5837442

  •  27-10-2019
  •  | 
  •  

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?

Foi útil?

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 QByteArrays em vez de const char*s e use username.data(), password.data() em vez de onde você usou username, password antes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top