看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2008 問題(Question): 請問 dll 間 heap 的使用要注意什麼呢? 在網路上找來的資料是說最好在dll內部new及delete 不要由第三方來delete,以確保程式new, delete的runtime是同一份 下頭是我的作法,在obj.dll中的所有class, 都寫了operator new, operator delete去呼叫obj.dll cpp中的memory alloctor 我以為這樣就可以把使用dll的所有heap生成在跟obj.dll cpp的heap中 但我試著在另一個explicit link的dll使用obj.dll來產生object 把pointer傳給main, 然後就free掉此library. 我的想法是此object是生成在obj.dll的heap中,就算此dll被freelibrary掉, 應該也不會影響到剛剛new出來的object才是, 可是我在main中delete此object時會出現錯誤, 是我那裡的觀念不對呢? 如果在linux下,情況又是如何呢? 程式碼(Code): obj.dll: //obj_dll.h class CMemoryAlloc { public: static void* AllocMemory(size_t alloc_size); static void FreeMemory(void *alloc_pointer); }; class CObject { public: ...... void* operator new(size_t alloc_size) { //轉呼叫dll內部的new return CMemoryAlloc::AllocMemory(alloc_size); } void operator delete(void *alloc_pointer) { CMemoryAlloc::FreeMemory(alloc_pointer); } }; //obj_dll.cpp void* CMemoryAlloc::AllocMemory(size_t alloc_size) { //我認為這裡new使用的heap會跟obj.dll用的是同一份 return ::operator new(alloc_size); } void CMemoryAlloc::FreeMemory(void *alloc_pointer) { ::operator delete(alloc_pointer); } /////////////////////////////////////////////////// create.dll: //create_dll.cpp CObject* CreateObject(void) { return new CObject; } /////////////////////////////////////////////////// main program: //implicit linking obj.dll //explicit linking create.dll int main(void) { ........ module=LoadLibrary("create.dll"); func=GetProcAddress(module,"CreateObject"); //在create.dll裡頭呼叫obj.dll中的CMemoryAlloc::AllocMemory來產生object CObject* obj=func(); //把create.dll release FreeLibrary(module); //在此時delete obj時會出錯,不能印證我的想法 delete obj; return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.193.31.42
layan:我想應是太早把 dll free 掉,你解構子的addr還在 dll 裡. 01/28 01:12
layan:可是你確先把 dll free 掉 真的跑到 delete 那行時 01/28 01:13
layan:你 CObject 解構子的 addr 早就是無效的位址了 01/28 01:13
Ebergies:因為你根本沒 call 到 obj.dll 裡的 new/delete 啊... 01/29 23:19
bignose1007:請問要怎麼呼叫obj.dll中的new, delete呢? 01/30 02:41
bignose1007:create.dll裡呼叫的new CObject不會呼叫到obj.dll 01/30 02:43
bignose1007:裡頭的 operator new/delete? 01/30 02:43
Ebergies:老實說我似乎弄錯了,operator new 似乎不用寫 static 01/30 17:38
bignose1007:是的, operator new/delete 就直接是static function 01/30 20:03
bignose1007:現在是對於dll間heap的關係有疑問. 01/30 20:04