DLL函數中內存分配及釋放的問題

DLL函數中內存分配及釋放的問題 最近一直在寫DLL,遇到了一些比較難纏的問題,不過目前基本都解決了。主要是一些內存分配引發問題,既有你們常常遇到的現象也有特殊的網絡

狀況,這裏總結一下,作爲資料。 錯誤現象是「其緣由多是堆被損壞,這也說明 **.exe 中或它所加載的任何 DLL 中有 bug」多線程

個人現象還有一個,就是直接運行EXE不在程序裏調試,不會報這個錯誤。 從網上找到的資料是: 一個模塊一個堆,一個線程一個棧。 dll裏malloc的內存,在exe裏free會出錯。ssh

CRT(C運行時期庫)不是使用進程缺省的堆來實現malloc(new中調用malloc)的,而是使用一個全局句柄HANDLE _crtheap來分配內存的。這socket

個_crtheap是在XXXCRTStartUp(CRT提供的進口點函數)中建立的。     因爲CRT靜態鏈接,則樓主的DLL裏有也有一個CRT,所以也有一個_crtheap。而在dll中的new使用dll中的_crtheap句柄分配堆,在exe中的函數

delete使用exe中的_crtheap釋放堆,固然失敗!測試

解決辦法: 1。在DLL中輸出一個函數給EXE調用,專門用來釋放由DLL分配的內存; 2。用GlobalAlloc()代替new,用GlobalFree()代替delete; 3。使用單一的堆,分配內存使用HeapAlloc(GetProcessHeap(),0,size),釋放內存使用HeapFree(GetProcessHeap(),0,p); 4。把dll和exe的Settings的C/C++選項卡的Code   Generation的Use   Run-time   liberary改爲Debug   Multithreaded   DLL,在Release線程

版本中改爲Multithreaded   DLL;這樣使用一個CRT了——MSVCRT.DLL。   如下是CSDN上的討論,一樣討論的很詳細了debug

以上是在網上找到的資料,今天作過詳細測試,結果以下:指針

測試1:使用malloc/free組合來分配和釋放內存,DLL中使用malloc分配,exe中使用free釋放。 我建的是Win32 DLL工程, C/C++->Code generation 設置是 Multithread DLL debug, 可是exe工程設置是MultiThread debug,因此無論怎麼樣調試

,老是會拋異常. 這就間接證實了上述的描述是正確的, 若我修改exe工程設置是 MultiThread DLL debug, 那麼malloc/free組合就能很好的工

做起來了。

測試2:使用HeapAlloc/HeapFree組合來分配和釋放內存,DLL中使用HeapAlloc分配,exe中釋放。 exe的配置仍是MultiThread Debug,DLL中HeapAlloc(GetProcessheap(), HEAP_ZERO_MEMORY, 1024)分配,exe中HeapFree(GetProcessHeap(),

0, p)釋放,,則仍是沒法正常運行,仍是拋異常。若exe中設置成MultiThread DLL debug就正常運行了。

測試3:仍是使用HeapAlloc/HeapFree來進行,可是DLL中導出一個方法來釋放DLL中分配的內存。 若exe配置是MultiThread Debug,沒法正常運行,拋異常。若修改爲MultiThread DLL debug正常運行。   因此獲得的結論以下: 不論是使用malloc/free組合仍是HeapAlloc/HeapFree組合,exe工程均須要設置成MultiThread DLL debug才能正常運行起來的,CSDN上的那個

討論在這兒貌似是由出入的,並且DLL的設置不能隨意修改。因此如有涉及到這種問題的,最好的辦法仍是在哪一個模塊分配的就在哪一個模塊釋放

最好,要否則反倒會引來更多的麻煩。

我在找「...其緣由多是堆被損壞,這也說明 **.exe 中或它所加載的任何 DLL 中有 bug。」解決辦法的時候找到的,學到一點,呵呵。可

惜我那工程的直接緣由並非由於上面所說的(也許間接緣由是),個人工程裏是開啓一個UI線程,UI線程中有一個view,結果單步調試時報錯

「...其緣由多是堆被損壞,這也說明 **.exe 中或它所加載的任何 DLL 中有 bug。」,最後解決辦法是,view須要用new建立,不能直接通

過create來建立,緣由是view應該是建在堆上

以上是在網絡上搜到的資料。個人實際狀況又與這個有所不一樣,固然,我已經按照上述的方法都測試過了,沒有解決問題。 個人問題是在線程裏分配了(NEW)一個類的指針(一個包含套接字的類),但在程序退出時報這個錯誤。後來通過考慮,我發現多是在程序

退出時,子線程仍在運行,形成指針仍在使用,因此我在退出時把子線程的循環條件置FALSE後,解決。 隨即又出現一個問題,我在程序退出時DELETE保存在LIST裏的SOCKET的時仍然報這個錯誤。最後解決辦法還是上面的思路,(多線程)把程序

關閉時,先shutdown套接字,而後closesocket套接字,最後延時2秒,OK,取代了原來::WaitForSingleObject(hRecv,2000)而後再

TerminateThread(hRecv,temID);比較暴力的方法。

相關文章
相關標籤/搜索