qstring轉const char*傳入函數的區別
方式1.
const char* testChar = str.toLocal8Bit().data(); testFun(testChar);
方式2.
testFun(str.toLocal8Bit().data());
兩種方式有何區別?
以下是繼承qsting轉換的中間對象QByteArray后的測試結果
結論:
- 方式1不能直接使用 中間變量需要需要用臨時變量賦值
- 方式2在debug與release都滿足預期EByteArray在函數調用完成后才析構
參考寫法
//方法1 QByteArray byteData = str.toLocal8Bit(); const char* testChar = byteData.data(); testFun(testChar); //方法2 testFun(str.toLocal8Bit().data());
,測試代碼如下:
#include <QtCore/QCoreApplication> #include <QDebug> #include <QByteArray> class EByteArray :public QByteArray { public: EByteArray(const char* charData, int size = -1) :QByteArray(charData,size) { qDebug() << "EByteArray create"; } ~EByteArray() { qDebug() << "EByteArray delete"; } }; class TestClass { public: EByteArray getBytes() { EByteArray aa("aaa"); return aa; } }; void testFun(const char* test) { qDebug() <<"print in Fun"<< test; } int main(int argc, char* argv[]) { QCoreApplication a(argc, argv); {//常規使用方法 類似在函數輸入中調用 str.toLocal8Bit().data() qDebug() << "--------------start test1"; TestClass t1; qDebug() << "start fun"; testFun(t1.getBytes().data()); qDebug() << "--------------end test1"; } {//變量轉接方法 將char*獲取到再傳入函數 qDebug() << "--------------start test2"; TestClass t1; const char* testChar = t1.getBytes().data(); qDebug() << "start fun"; testFun(testChar); qDebug() << "--------------end test2"; } {//常規使用方法 函數輸入中調用 str.toLocal8Bit().data() qDebug() << "--------------start test3"; QString str = "aaa"; qDebug() << "start fun"; testFun(str.toLocal8Bit().data()); qDebug() << "--------------end test3"; } {//變量轉接方法 將char*獲取到再傳入函數 qDebug() << "--------------start test4"; QString str = "aaa"; const char* testChar = str.toLocal8Bit().data(); qDebug() << "start fun"; testFun(testChar); qDebug() << "--------------end test4"; } {//變量轉接方法 QByteArray增加臨時變量暫存 將char*獲取到再傳入函數 qDebug() << "--------------start test5"; QString str = "aaa"; QByteArray byteData = str.toLocal8Bit(); const char* testChar = byteData.data(); qDebug() << "start fun"; testFun(testChar); qDebug() << "--------------end test5"; } return a.exec(); }
運行結果
release
--------------start test1 start fun EByteArray create print in Fun aaa EByteArray delete --------------end test1 --------------start test2 EByteArray create EByteArray delete start fun print in Fun aaa --------------end test2 --------------start test3 start fun print in Fun aaa --------------end test3 --------------start test4 start fun print in Fun start fun --------------end test4 --------------start test5 start fun print in Fun aaa --------------end test5
debug
--------------start test1 start fun EByteArray create EByteArray delete print in Fun aaa EByteArray delete --------------end test1 --------------start test2 EByteArray create EByteArray delete EByteArray delete start fun print in Fun ???????? --------------end test2 --------------start test3 start fun print in Fun aaa --------------end test3 --------------start test4 start fun print in Fun ???????????????????????????????????????????? --------------end test4 --------------start test5 start fun print in Fun aaa --------------end test5