QString 到 const char* 的不同结果

Different results for QString to const char*

本文关键字:结果 const char QString      更新时间:2023-10-16

我有一个代码片段来测试代码错误。

#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString name = QString("Lucy");
QString interest = QString("Swimming");
const char* strInterest = interest.toLatin1().data();
const char* strName = name.toLatin1().data();
qDebug()<<"QName: "<<name<<" QInterest: "<<interest;
qDebug()<<"Name: "<<strName<<" Interest: "<<strInterest;
return a.exec();
}

macOS上的结果: QName: "Lucy" QInterest: "Swimming" Name: Lucy Interest: .

在 ubuntu上的结果: root@:test$ ./testCharP QName: "Lucy" QInterest: "Swimming" Name: Interest: .
如您所见,转换后的缓冲区不会保存为 const 值,问题如何? 另外,这两个操作系统之间存在一些差异,原因可能是什么?

你观察到的是未定义的行为。

toLatin1()的调用会创建一个 临时QByteArray,该行之后立即销毁,因为您不存储它。data()获得的指针悬而未决,可能会也可能不会打印有用的内容。

正确版本:

const QByteArray& latinName = name.toLatin1();
const char* strName = latinName.data();

问题是toLatin1函数返回一个QByteArray对象,并且如果不保存此对象,它将是临时的,一旦赋值完成就会被销毁。

这意味着您的指针指向一些不再存在的数据,取消引用它将导致未定义的行为