QString 到 const char* 的不同结果
Different results for QString to const char*
我有一个代码片段来测试代码错误。
#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:
.
可以看到,转换后的buffer并没有保存为const值,请问有什么问题呢?
还有,这两个有一些区别OS,请问是什么原因呢?
问题是 toLatin1
function returns a QByteArray
对象,如果不保存这个对象,它将是临时的,一旦分配完成就会被破坏。
这意味着您的指针指向一些不再存在的数据,取消引用它会导致未定义的行为。
您观察到的是未定义的行为。
对 toLatin1()
的调用创建了一个临时 QByteArray
,它在该行之后立即被销毁,因为您没有存储它。 data()
获得的指针悬空,可能会或可能不会打印出有用的东西。
正确版本:
const QByteArray& latinName = name.toLatin1();
const char* strName = latinName.data();
我有一个代码片段来测试代码错误。
#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:
.
可以看到,转换后的buffer并没有保存为const值,请问有什么问题呢?
还有,这两个有一些区别OS,请问是什么原因呢?
问题是 toLatin1
function returns a QByteArray
对象,如果不保存这个对象,它将是临时的,一旦分配完成就会被破坏。
这意味着您的指针指向一些不再存在的数据,取消引用它会导致未定义的行为。
您观察到的是未定义的行为。
对 toLatin1()
的调用创建了一个临时 QByteArray
,它在该行之后立即被销毁,因为您没有存储它。 data()
获得的指针悬空,可能会或可能不会打印出有用的东西。
正确版本:
const QByteArray& latinName = name.toLatin1();
const char* strName = latinName.data();