Qt可变寿命误解
Qt variable lifetime misunderstanding
我有以下工作代码:
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()
的文档所说:
只要字节数组没有被重新分配,指针就保持有效或者销毁。
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 如何在Qt中取消捕获字符串
- Qt SQLite没有查询或参数计数不匹配
- Qt可变寿命误解