[讀書筆記]crt靜態鏈接注意模塊間內存傳遞

誰申請,誰釋放。


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章