为什么这个QString到const char*的转换会在Windows上生成Debian标识符?

为什么这个QString到const char*的转换会在Windows上生成Debian标识符?,windows,string,qt,qstring,Windows,String,Qt,Qstring,我正在尝试将libssh2包装到Qt中,代码如下: const char* username = inUsername.toLocal8Bit().data(); const char* password = inPass.toLocal8Bit().data(); 问题是,用户名和密码无法连接到系统。为什么? 因为,根据调试器 username "5.1p1 Debian-6ubuntu2" password "5.1p1 Debian-6ubuntu2" 这些不是我为用户名或密码提供

我正在尝试将libssh2包装到Qt中,代码如下:

const char* username = inUsername.toLocal8Bit().data();
const char* password = inPass.toLocal8Bit().data();
问题是,用户名和密码无法连接到系统。为什么?

因为,根据调试器

username  "5.1p1 Debian-6ubuntu2"
password  "5.1p1 Debian-6ubuntu2"
这些不是我为用户名或密码提供的值。我已经尝试过使用ascii、toLatin1和附加(或不附加).data()。尽管如此,我还是得到了这些值,而不是期望值。我在Windows上,这就是为什么它更麻烦的原因,因为据我所知,我没有在Debian或Ubuntu上编译过任何东西

这是怎么回事?

此代码:

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

Wow。哇。我从Qt帮助页面()中获得了这段代码,但当然,他们没有提到这一点点琐事。我不知道是应该对他们非常生气,还是沮丧地摇摇头,因为这件小事只花了我几天的时间。谢谢你的帮助,这让我的生活变得更轻松。@mmr:我注意到文档中有一些空白,但我不认为这是其中之一。您链接的页面明确表示它返回一个QByteArray,而QByteArray()上的data()文档则表示它返回一个指针,该指针仅在字节数组更改或销毁之前有效。