作者bignose1007 (bignose)
看板C_and_CPP
標題[問題] DLL間heap使用的問題
時間Fri Jan 28 00:47:16 2011
開發平台(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