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

标签 windows string qt qstring

我试图在 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 现在指向已删除/释放的内存。

为了解决这个问题,将usernamepassword设为QByteArray而不是const char*,并且使用 username.data(), password.data() 代替之前使用 username, password 的地方。

关于windows - 为什么此 QString 到 const char* 的转换会在 Windows 上生成 Debian 标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5837442/

相关文章:

c++ - 外部 IP 地址

python - Windows命名管道: detect in Python on writer side when reader has closed its end without having to write data

c# - 对字符串值内的数据进行排序

Qt QML 设置未保存/应用

Java 无法识别的选项 : -xvf

python - MySQL "data"文件夹不断增长,即使在 DROP TABLE 之后也是如此

python - 从列表中取出字符并将它们变成其他字符

string - rails4//pluralize 当计数为 0 时进行复数化

c++ - 更改 QGraphicsView 中的光标

c++ - itemChanged 信号在应用程序启动时没有更改项目时起作用