Почему преобразование QString в const char * создает идентификатор Debian в Windows? - PullRequest
2 голосов
/ 30 апреля 2011

Я пытаюсь обернуть libssh2 в Qt, и у меня следующий код:

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

Проблема в том, что имя пользователя и пароль не подключаются к системе.Почему?

Потому что, согласно отладчику,

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

Это не те значения, которые я дал для имени пользователя или пароля.Я пытался toAscii, toLatin1 и добавлял (или нет) .data ().Тем не менее, я получаю эти значения вместо ожидаемых значений.Я нахожусь на Windows, поэтому это еще более тревожно, так как, насколько я могу судить, я ничего не скомпилировал в Debian или Ubuntu.

Что здесь происходит?

1 Ответ

7 голосов
/ 30 апреля 2011

Этот код:

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

эквивалентно этому:

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

Вы видите, что происходит? К моменту выполнения инструкции временная QByteArray снова была удалена компилятором. Поскольку data() возвращает только указатель на внутренний буфер QByteArray, username теперь указывает на удаленную / освобожденную память.

Чтобы решить эту проблему, сделайте username и password QByteArray s вместо const char* s и используйте username.data(), password.data() вместо того, где вы использовали username, password ранее. 1021 *

...