将 QByteArray 转换为 char* 的问题
Issue with conversion QByteArray to 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*
变量存储结果,从 QByteArray
到 const char*
的转换是否有任何问题?
toUtf8
returns 生命周期结束于表达式末尾的对象。
constData
returns 指向此临时对象的指针。
因此,您使用的是悬挂指针并且行为未定义。
您需要延长转换后的字符串的生命周期:
QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();
此调用 string1.toUtf8().constData()
由两个后续调用组成:QString::toUtf8()
产生临时 QByteArray
和 QByteArray::constData()
returns 指向临时的指针最终被销毁的对象。
我以前获取QString变量,将其转换为QByteArray,最后const char*的方式是这样的:
QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data();
QString的值由Ui在lineEdit中收集。
我遇到了一个问题,在将 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
returns 生命周期结束于表达式末尾的对象。
constData
returns 指向此临时对象的指针。
因此,您使用的是悬挂指针并且行为未定义。
您需要延长转换后的字符串的生命周期:
QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();
此调用 string1.toUtf8().constData()
由两个后续调用组成:QString::toUtf8()
产生临时 QByteArray
和 QByteArray::constData()
returns 指向临时的指针最终被销毁的对象。
我以前获取QString变量,将其转换为QByteArray,最后const char*的方式是这样的:
QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data();
QString的值由Ui在lineEdit中收集。