在将QByteArray
转换为const char*
时,我遇到了一个无法解释的问题。这里有一个例子:
QString string1("ABCDEFGHI");
const char* stringData1 = string1.toUtf8().constData();
qDebug() << "String:" << string1 << "nbytearray:" << string1.toUtf8()
<< "ndata immediate:" << string1.toUtf8().constData() << "ndata stored:" << stringData1;
QString string2("ABCDEFGHJ");
const char* stringData2 = string2.toUtf8().constData();
qDebug() << "String:" << string2 << "nbytearray:" << string2.toUtf8()
<< "ndata immediate:" << string2.toUtf8().constData() << "ndata stored:" << stringData2;
我得到以下输出:
String: "ABCDEFGHI"
bytearray: "ABCDEFGHI"
data immediate: ABCDEFGHI
data stored:
String: "ABCDEFGHJ"
bytearray: "ABCDEFGHJ"
data immediate: ABCDEFGHJ
data stored: ABCDEFGHJ
data stored
的输出不能保证在情况1中是错误的,但在情况2中是正确的。我可以交换情况1和情况2,结果是一样的——情况1是错误的,但情况2是正确的。
内联转换似乎运行得很好。
如果使用const char*
变量存储结果,那么从QByteArray
到const char*
的转换是否存在任何问题?
toUtf8
返回一个对象,该对象的生存期在表达式结束时结束constData
返回一个指向此临时对象的指针
因此,您使用的是悬空指针,而行为是未定义的。
您需要延长转换字符串的使用寿命:
QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();
此调用string1.toUtf8().constData()
由两个相应的调用组成:QString::toUtf8()
生成临时QByteArray
,QByteArray::constData()
返回指向临时对象的指针,该对象最终被销毁。
我用来获取QString变量,将其转换为QByteArray,最后const char*的方法是:
QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data();
QString的值由Ui在lineEdit中收集。