我有以下工作代码:
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的新手,因为我在文档中忽略了这一点,所以我不知道将来如何避免类似的问题。
答案 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()
的文档所述:
只要不重新分配字节数组,指针就会保持有效 或者被毁坏。