誰申請,誰釋放。
VOID ExeFunc()
{
PVOID pv = DLLFunc();
// do somtehing via pv
free(pv);
}
PVOID DLLFunc()
{
return(malloc(100));
}
上面的代碼表示,在DLL的函數DLLFunc申請內存,而在Exe的函數ExeFunc()中釋放,有問題嗎?
不一定。
結果與c/c++運行時庫的鏈接方式有關,在vs中就是 property - Configuration Properties - c/c++ - Code Generation - Runtime Library中的設置
這幾個選項詳細的意思很多地方都有介紹,這裏就不說了,只說一點就是,不帶DLL的表示靜態鏈接運行時庫,當然,問題也就在這裏。
如果上面的Exe和DLL其中有一個或者兩個都是靜態鏈接運行時庫,那麼上面的代碼會有問題。
CRT(C運行時期庫)不是使用進程缺省的堆來實現malloc(new中調用malloc)的,而是使用一個全局句柄HANDLE _crtheap來分配內存的。這個_crtheap是在XXXCRTStartUp(CRT提供的進口點函數)中創建的。
由於CRT靜態連接,則DLL裏有也有一個CRT,因此也有一個_crtheap。而在dll中的new使用dll中的_crtheap句柄分配堆,在exe中的delete使用exe中的_crtheap釋放堆,當然失敗!
new其實也會調用malloc