Qt可变寿命误解

Qt variable lifetime misunderstanding

本文关键字:误解 Qt      更新时间:2023-10-16

我有以下工作代码:

QFile file(fileName);
if(!file.open(QIODevice::ReadOnly)) throw GException(GString("Failed to open file "));
QTextStream stream(&file);
QString s = stream.readAll();
QByteArray source = s.toUtf8();
const char *string = source.data();
glShaderSource(id, 1, &string, NULL);
glCompileShader(id);
qDebug() << QString(string);
如果我像这样删除QString变量,代码继续工作:
QByteArray source = stream.readAll().toUtf8();
const char *string = source.data();
glShaderSource(id, 1, &string, NULL);
glCompileShader(id);
qDebug() << QString(string);

但是移除QByteArray会导致string指向垃圾:

QString s = stream.readAll();
const char *string = s.toUtf8().data();
glShaderSource(id, 1, &string, NULL);
glCompileShader(id);
qDebug() << QString(string); // GARBAGE HERE

我在这里的文档中找不到与此行为相关的信息:http://doc.qt.io/qt-5/qstring.html#toUtf8

我猜toUtf8()方法不返回指针到内部数组,但创建一个新的。

我是Qt的新手,因为我在文档中缺少了这一点,我不知道如何在将来避免类似的问题。

QString::toUtf8()返回QByteArray,而不是指针。QString不将字符串存储为utf-8 C字符串:

QString存储一个16位QChar的字符串,每个QChar对应一个Unicode 4.0字符。(具有以上代码值的Unicode字符65535使用代理字符对存储,即两个连续的qchar。)

在那一行:

const char *string = s.toUtf8().data();

您在临时QByteArray上使用QByteArray::data(),但是正如data()的文档所说:

只要字节数组没有被重新分配,指针就保持有效或者销毁。