Qt变量终身误解

时间:2015-05-19 18:16:23

标签: c++ qt

我有以下工作代码:

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会导致字符串指向垃圾:

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的新手,因为我在文档中忽略了这一点,所以我不知道将来如何避免类似的问题。

1 个答案:

答案 0 :(得分:3)

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

  

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

在那一行:

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

您在QByteArray暂时使用QByteArray::data(),但正如data()的文档所述:

  

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