qPrintable 的定义:
# define qPrintable(string) QString(string).toLocal8Bit().constData()
toLocal8Bit 返回一个 QByteArray。 QByteArray::constData() 的文档:
toLocal8Bit() 创建一个临时的 QByteArray,它在 constData() 被调用后被销毁。所以 constData 返回的指针指向释放的内存。
我在这里错过了什么吗?
附加评论:
qPrintable 的文档说明了这一点:
但是,这是什么意思?根据我的理解,这与“指针从 qPrintable 返回的那一刻起无效”相同
为什么我问:
我见过代码失败,可以像这样简化:
someFunction( stringA.toLatin1().constData(), stringB.toLatin1().constData())
在被调用的函数内部,两个参数都是指向同一地址的指针。
最佳答案
qPrintable
宏应该用于调试目的:
qWarning("%s: %s", qPrintable(key), qPrintable(value));
或者:
qDebug() << "My value is: " << qPrintable(value);
这里由
QByteArray
创建的临时 QString::toLocal8Bit
对象在整个语句完成后被销毁,这发生在使用 QByteArray::constData()
指针之后。在这种情况下,我们遇到了您描述的问题:
QString s = "Hello";
const char *debug_string = s.toLocal8Bit().constData();
// Can't use debug_string here as the pointer is invalid:
// qDebug() << debug_string
关于c++ - qPrintable 是否容易出现访问冲突?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36500114/