qstring 方法toLocal8Bit().data()的注意事項


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM