将QByteArray转换为char*时出现问题



在将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*变量存储结果,那么从QByteArrayconst char*的转换是否存在任何问题?

toUtf8返回一个对象,该对象的生存期在表达式结束时结束
constData返回一个指向此临时对象的指针
因此,您使用的是悬空指针,而行为是未定义的。

您需要延长转换字符串的使用寿命:

QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();

此调用string1.toUtf8().constData()由两个相应的调用组成:QString::toUtf8()生成临时QByteArrayQByteArray::constData()返回指向临时对象的指针,该对象最终被销毁。

我用来获取QString变量,将其转换为QByteArray,最后const char*的方法是:

QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data(); 

QString的值由Ui在lineEdit中收集。

最新更新