看板 C_and_CPP 關於我們 聯絡資訊
程式設計師的自我修養 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