我试图在 Qt 中包装 libssh2,并具有以下代码:
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 上编译过。
这是怎么回事?
最佳答案
这段代码:
const char* username = inUsername.toLocal8Bit().data();
等同于:
const char * username;
{
const QByteArray l8b = inUsername.toLocal8Bit();
username = l8b.data();
}
你知道发生了什么吗?当语句执行时,临时的 QByteArray
已被编译器再次删除。由于 data()
仅返回指向内部 QByteArray
缓冲区的指针,因此 username
现在指向已删除/释放的内存。
为了解决这个问题,将username
和password
设为QByteArray
而不是const char*
,并且使用 username.data()
, password.data()
代替之前使用 username
, password
的地方。
关于windows - 为什么此 QString 到 const char* 的转换会在 Windows 上生成 Debian 标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5837442/