【问题标题】:Issue with conversion QByteArray to char*将 QByteArray 转换为 char* 的问题
【发布时间】:2020-12-11 11:52:45
【问题描述】:

我遇到了一个问题,在将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 的输出不能保证在 case 1 中是错误的,但在 case 2 中是正确的。我可以交换 case 1 和 case 2,结果将是相同的 - 在 case 1 中错误,但在 case 中正确2.

内联转换似乎工作得很好。

如果使用const char* 变量存储结果,您是否发现从QByteArray 到const char* 的转换有任何问题?

【问题讨论】:

  • 您在QString::toUtf8 返回的临时 QByteArray 上调用QByteArray::constData。所以stringData1 和stringData2 是悬空指针:未定义的行为。

标签: c++ qt qt5


【解决方案1】:

toUtf8 返回一个对象,其生命周期在表达式末尾结束。
constData 返回指向此临时对象的指针。
因此,您使用的是悬空指针并且行为未定义。

需要延长转换后字符串的生命周期:

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

【讨论】:

    【解决方案2】:

    此调用 string1.toUtf8().constData() 包含两个相应的调用:QString::toUtf8() 产生一个临时的 QByteArray 和 QByteArray::constData(),它返回一个指向临时对象的指针,该对象最终被销毁。

    【讨论】:

      【解决方案3】:

      我以前获取 QString 变量的方式,将其转换为 QByteArray,最后 const char* 是这样的:

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

      QString 的值由 Ui 收集,在 lineEdit 中。

      【讨论】:

        猜你喜欢
        • 2013-02-26
        • 2014-02-19
        • 1970-01-01
        • 2013-01-04
        • 2017-12-12
        • 2016-01-31
        • 2019-04-05
        • 2019-03-15
        • 1970-01-01
        相关资源
        最近更新 更多