所以最近我正在(尝试)从 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/