2012-06-13 1731 views
1

我已經使用MSVC2008從源碼構建Qt,因爲它建議避免任何不兼容問題。當我使用返回QList對象的Qt函數時,我遇到了問題。Qt在使用QList時崩潰(堆損壞)

QList<QNetworkInterface> *netInterfaces = new QList<QNetworkInterface>; 
*netInterfaces = QNetworkInterface::allInterfaces(); 
delete netInterfaces; 

該代碼將始終「刪除netInterfaces」在free.c試圖以釋放內存時崩潰。它指出堆已損壞,我不知道爲什麼,因爲所有東西都是用相同版本的MSVC編譯的。

它發生的返回,甚至當我只需要調用該函數的QList對象Qt的所有功能:

QNetworkInterface::allInterfaces(); 

通過上面的代碼,應用程序將總是立即試圖通過Qt的分配空閒堆時崩潰。奇怪的是,這隻發生在Debug版本中。發佈版本工作正常,沒有任何崩潰。

我的Qt 4.8.0使用/ MT(多線程)編譯,我動態鏈接到庫。我的應用程序也被編譯爲多線程。

有沒有人知道這可能是什麼原因造成的問題?

+0

我想我已經找到了解決我的問題在這裏:http://qt-project.org/forums/viewthread/16513任何人都可以確認嗎? – blackd0t

+0

確保您不要混用版本和調試版本。使用[dependency walker](http://www.dependencywalker.com/)確認可執行文件僅與運行時的一個副本鏈接。 –

回答

2

我找到了解決我的問題的方法。顯然Qt有它自己的堆分配器集,而我有一個多線程(/ MT)構建和一個共享庫,Qt會在DLL中使用它們自己的內存處理程序分配堆。在這個內存被Qt分配後,我的應用程序試圖在我自己的代碼中釋放這些內存塊,導致崩潰,因爲Qt和主應用程序之間的堆結構不同。

我已經用/ MT標誌重建了Qt,但現在我生成了一個靜態庫而不是共享庫。在我將Qt靜態地與我的應用程序連接後,所有堆問題都神奇地消失了。

我在這裏可能會出現一些錯誤,但我希望至少該解決方案能夠幫助一些找到此線程的人。我在互聯網上看到了不少人遇到這個問題,關鍵是要真正理解,當使用/ MT標記構建時,不應鏈接共享庫。/MD會很好。

這裏是我發現的線程開導我:http://qt-project.org/forums/viewthread/16513

乾杯!

+0

Qt沒有任何堆分配器!我*可*可執行文件間接鏈接到兩個運行時庫,因爲Qt和您的應用程序是針對不同的運行時間鏈接的。你不需要靜態編譯Qt。 –