用例項證明dll中new的記憶體不能在exe中釋放

2021-06-18 22:30:27 字數 483 閱讀 7018

vc中新建乙個dll工程,設定使用「多執行緒除錯dll (/mdd)」。該dll匯出以下alloc函式:

__declspec( dllexport )

int* alloc()

vc中新建乙個exe工程,設定使用「多執行緒除錯(/mtd)」,並且引用剛才的dll工程,該工程的main函式如下:

__declspec( dllimport )  int* alloc();

int _tmain(int argc, _tchar* argv)

執行以上程式可以發現兩個現象:

2.      delete p語句在執行的時候報錯。原因是:既然malloc**位址有兩份,可以知道兩個c執行庫中的全域性變數也有兩份,維護堆的資料結構也有兩份,那麼乙個c執行庫new出來的位址,在另乙個c執行庫中不會有記錄,也就不能去delete。

EXE中釋放DLL中分配的記憶體

在dll中分配的記憶體,如果到其呼叫者中釋放,可能會出現crash的情況,其原因在於 在dll中的code generation如果是採用了mt 靜態載入libcrtd.lib 在該庫中維護了乙個allocator的物件對記憶體分配進行管理,當exe中呼叫free等函式對記憶體進行釋放時,他自己也維...

乙個 new 物件在記憶體中的誕生

persion persion new persion 乙個簡單的new物件在記憶體中的誕生 1.生成persion.class檔案通過類載入器載入進記憶體中 2.執行main方法,棧中開闢main方法記憶體空間 壓柞 進棧 main在最底,在棧空間中分配了乙個變數persion的記憶體 3.在堆記...

靜態方法中不能new內部類的例項物件的總結

原文 class test start system.out.println aaaaaa class a 靜態方法中不能new內部類的例項物件。這是為什麼了?內部類的最重要的乙個特點就是它可以直接訪問它外部類的成員變數。成員變數是 物件身上的。物件建立完成了,才會為成員變數分配空間。能呼叫成員變數...