c++ - QT什么时候不允许一行多次转换,比如QString to char*

标签 c++ qt char qstring

所以最近我正在(尝试)从 QString 转换为 char* 使用:

QString str;

const char *ptr = str.toLatin1().constData();

它没有抛出任何错误,但我的程序无法运行,我花了很多时间来弄清楚错误是什么: 根据 https://wiki.qt.io/Technical_FAQ#How_can_I_convert_a_QString_to_char.2A_and_vice_versa.3F

Note that it is necessary to store the bytearray before you call data() on it, a call like the following.

const char *c_str2 = str2.toLocal8Bit().data(); 

will make the application crash as the QByteArray has not been stored and hence no longer exists

所以我的问题是如何知道这种类型的单行转换何时是危险的并且最好避免它们。一般来说,当结果是一个指针或者这只是一个特殊情况时?您还遇到过哪些类似的例子?

非常感谢。

最佳答案

在 C++ 中,程序员负责管理对象和数据的生命周期。

有时这对您来说是隐藏的,其他对象管理生命周期。

在这种情况下不是。

const char *c_str2 = str2.toLocal8Bit().data(); 

ths QString 中没有存储自身的 Local8Bit 版本。当您调用 toLocal8Bit 时,它会使用不同的编码在自动/临时存储中创建一个新对象。

当这个 Local8Bit 对象被销毁时,它会带走它的数据。

在这种情况下,您创建了一个临时对象。它的生命周期在您创建它的完整表达式结束时结束。

.data() 成员返回一个指针指向您调用它的对象。该指针表示数据的非拥有 View 。当您指向的对象结束其生命周期时,该指针将不再有效。

所以 c_str2 是一个有效的指针,直到 ; 指针悬空为止。

无论何时在 C++ 中使用非智能指针,您都必须了解所指向数据的生命周期。如果不这样做,您的代码充其量只能意外运行。

关于c++ - QT什么时候不允许一行多次转换,比如QString to char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50012401/

相关文章:

c++ - STL算法处理符合条件的前N个元素

c++ - 抽象类修复的虚析构函数是模糊的

char总是使用flex改变

mysql - 对 Char 类型使用 Like 和 Concat

用 C 计算数组中包含的字母字符

c++ - 在 C/C++ 中取消引用 char 指针?

c++ - 如何创建一个html树?

c++ - 测试链表中的指针

c++ - Qt 包含和预编译 header 的最佳实践?

c++ - Qt Creator,使用分支名称构建目录