qstring轉char*遇到的內存問題


剛剛開始我是這么寫的

char* fun(QString data)
{
QByteArray byte = data.toLocal8Bit();
char* charData = byte.data();
return charData;
}

 

這樣子寫調用一次是可以的,不過多次調用后

char* bb = fun("bbs");
char* cc = fun("ccs");
char* dd = fun("dds");
char* ee = fun("ees");
char* ff = fun("ffs");

會導致前面的數據被后面的覆蓋,到最后bb,cc,dd,ee的數據都會變成ffs

究其原因,發現在fun函數中QByteArray 的地址一直沒有發生變化,也就是每次調用fun函數的時候QByteArray 的地址是同一個,因為返回的是指針,所以后面來的數據就會把前面的數據覆蓋掉,簡單說就是bb,cc,dd,ee,ff指向同一個內存地址,這個內存地址放的內容不斷被覆蓋更新。QByteArray 這個變量其實在調用這個fun函數后就已經不存在了,可能是qt編譯器優化后使得其指向同一個地址。而我們返回的是指向該變量成員函數data的指針,所以導致錯誤。

 

所以我們只要讓fun中的這個QByteArray每次調用的時候不一樣,就可以了,由於函數里面的變量放在棧中,離開了其所在的{}就失效了,所以改用new,這樣子就可以使得函數變量生成在堆中,然后手動釋放,優化函數如下所示

char* fun(QString data)
{
QByteArray* byte = new QByteArray(data.toLocal8Bit());
char* charData = byte->data();
return charData;

}

這樣子我們就達到了預期的效果,但是最后要記得把new出來的東西delete掉,所以在每次調用改函數前把QByteArray 的地址保存在自己定義的QList<QByteArray*>中

程序最后再把這些地址的內存調用delete逐一釋放,避免內存泄漏。

 

 

研究過程中我還試過了一個函數

char* fun(QString data)

{

return data.toLocal8Bit().data();

}

理論上這個函數應該是可以的,因為每次調用該函數的時候data的地址是不一樣的,但是打印出&data.toLocal8Bit()的地址是指向同一個的,這個可能qt編譯器優化過,使得data.toLocal8Bit()的調用使得其自動生成一個QByteArray 對象導致的。

淺薄之見,希望有高手讀者指點一二

 


免責聲明!

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



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