1. 程式人生 > >在dll中記憶體的使用

在dll中記憶體的使用

11 樓lop5712(LOP)

哈哈哈哈,真是搞笑,事實總是與想象差距甚遠。一個模組一個堆,一個執行緒一個棧。   
    
  問題的一切都要歸咎於C執行時期庫是靜態連線的。   
  我回去看了一下C執行時期庫的原始碼,發現一個很搞笑的事實:CRT(C執行時期庫)不是使用程序預設的堆來實現malloc(new中呼叫malloc)的,而是使用一個全域性控制代碼HANDLE   __crtheap(好象是_crtheap,記不清了)來分配記憶體的。這個_crtheap是在XXXCRTStartUp(CRT提供的進口點函式)中建立的。   
  由於CRT靜態連線,則樓主的DLL裡有也有一個CRT,因此也有一個_crtheap。而在dll中的new使用dll中的_crtheap控制代碼分配堆,在exe中的delete使用exe中的_crtheap釋放堆,當然失敗!不信的話,樓主大可在你的exe和dll中各下一個斷點,在變數檢視中輸入_crtheap來檢視其值,一般會差個0x10000000-0x04000000,因為預設dll的基址是0x10000000,而exe的是0x04000000。   
    
  因此你的模組也有一個與之相關聯的堆了,因為使用C/C++語言編寫,而且CRT靜態連線。   
  To   bluebohe(薄荷)   
          由於上面的原因,所以你說的第三個方法將無效,因為不能改變CRT靜態連線和用C++編寫的事實。不過由於沒有試過,我也不敢妄下定論(我對CRT的執行機理還不瞭解),說它是錯的,試過才知道。