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/

10-12 19:41