作者purpose (purpose)
看板C_and_CPP
標題Re: [問題] 不同dll無法任意互相release resource?
時間Thu Jan 17 00:45:10 2013
程式設計師的自我修養 p.349 說使用了不同的 CRT...
============================================================
使用不同的 CRT -> 擁有不同的堆積
擁有不同的堆積 -> 不能在 A 中申請記憶體然後在 B 中釋放
============================================================
所以,這個世界不是只有使用不同的 CRT,才會擁有不同的堆積,才會不能在 B 釋放。
用 gcc 編譯的 Windows 成品,裡面的 free, delete 也一樣底層要用
BOOL WINAPI HeapFree(
_In_ HANDLE hHeap,
_In_ DWORD dwFlags,
_In_ LPVOID lpMem
);
來做釋放的動作,跟微軟家的 CRT 並無差別。
也不是說,CRT v1.0 跟 CRT v2.0 這樣版本不同,才會導致堆積不同。
堆積是怎麼跑出來的?hHeap 是何時、何地、何方建造儲存於何處?
去 google 查,都有。
為了要讓 malloc, free, new, delete 這些函數能正常運行,不管是 DLL, EXE 形態,
都會確保自己有個堆積,所以你新增*一個,我新增一個,大家各有各的 hHeap。
就像每個縣市都要一間大學一樣
最後 free 時又像全世界都台北國,講中山路三個字,就會腦補成台北中山路一樣
* 新增:
HANDLE WINAPI HeapCreate(
_In_ DWORD flOptions,
_In_ SIZE_T dwInitialSize,
_In_ SIZE_T dwMaximumSize
);
Return value
If the function succeeds, the return value is a handle to the newly created
heap.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.128.121
推 EdisonX:push :) 我想該書說的不同其實蠻廣的, 其中包含了 01/17 01:35
→ EdisonX:msvcrt.dll / msvcrtd.dll 這樣也視為不同. 01/17 01:35
也許還有此意—當 A,B 兩方動態連結了完全相同的 C-RuntimeLib DLL 時,這時候
為了節省空間,兩方存取同一塊,因此雙方頻率相同,blah blah...
最終得到 hHeap 參數一致,在 A 做 malloc 的記憶體可以在 B free 無誤。
現實上,這個釋放記憶體的議題,就一種對策
在自己 EXE 內配置的記憶體,在自己 EXE 內釋放;
若 DLL_A_fun1 配置了記憶體 ptr,則只使用 DLL_A_funX 去釋放此記憶體。
換言之,就是「不在 A 地,釋放 B 地配置的記憶體」。
換言之,就是寫程式寫到 free(ptr) 時,沒人在乎 CRT 等一下要怎樣連結,
只需要確認 ptr 來自於何方,就這樣而已,其他都不需要。
※ 編輯: purpose 來自: 124.8.128.121 (01/17 08:03)
推 EdisonX:p 大懂真多,好文,再推一次。 01/17 17:05