2

我正在尝试将 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 上编译的。

这里发生了什么?

4

1 回答 1

7

这段代码:

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

相当于:

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

你看到发生了什么事吗?到语句执行时,QByteArray编译器再次删除了临时变量。由于data()只返回一个指向内部QByteArray缓冲区的指针,username现在指向已删除/释放的内存。

为了解决这个问题,用usernameandpassword QByteArray代替const char*s,用username.data(),password.data()代替你之前使用username的 , password

于 2011-04-29T21:19:54.180 回答