問題:如果程式的模組中有乙個鏈結到靜態c/c++執行期庫,那麼在這個模組中分配記憶體而在另乙個模組中釋放這塊記憶體將失敗。
原因:造成失敗的原因是分配和釋放記憶體不是由相同的堆管理程式完成的,例如動態鏈結庫中的堆在預設情況下是由msvcrt.dll中的堆管理程式管理的(以動態鏈結的方式),而exe程式的堆在預設情況下是由程式自己的**管理(以靜態鏈結的方式),由於它們的堆管理程式不同,當動態鏈結庫分配的內存在exe程式中釋放時就會出錯,因為exe程式所在的堆並沒有分配這塊記憶體,而你卻要求它釋放這塊記憶體。
解決方法:將程式中所有的模組都鏈結到c/c++執行期庫multithreaded dll,修改後所有分配和釋放堆上記憶體的操作都由同乙個堆管理程式管理,這樣便解決了問題。
注意:vc6中的stl在dll和程式之間傳遞會出錯。ms建議公升級到更高版本或使用第三方stl。
記憶體分配和釋放
自從學習了c語言,老師就教導我們說 對於動態記憶體的申請和釋放,一定要遵守 誰申請,誰釋放 的原則。在此原則的指導下,不僅是我 不僅是你,就連特級大師都設計了這樣怪怪的函式 函式說明 getwindowtext hwnd,lptstr,int 取得視窗標題。需要在引數中給出儲存標題所使用的記憶體指標...
記憶體分配和釋放
三 記憶體分配和釋放 自從學習了c語言,老師就教導我們說 對於動態記憶體的申請和釋放,一定要遵守 誰申請,誰釋放 的原則。在此原則的指導下,不僅是我 不僅是你,就連特級大師都設計了這樣怪怪的函式 函式說明 getwindowtext hwnd,lptstr,int 取得視窗標題。需要在引數中給出儲存...
堆記憶體的分配和釋放
示例 int i 10 int p int malloc sizeof int 在堆中分配乙個整數大小的記憶體.printf p,d n i,i printf p,d n p,p free p 必須要手動釋放堆記憶體.特殊示例 int main void test char p 列印結果 null ...