最近在做的一個項目,我們的一個EXE調(diào)用了DLL,其中EXE會使用DLL new出來的變量指針,而且會在EXE delete這些指針,同樣,DLL也會使用及delete由EXE new出來的變量指針。
開始在做測試的時候沒有發(fā)現(xiàn)任何問題,當時用的是DEBUG版本。 可是后來發(fā)現(xiàn)Release版本運行程序時總是會崩,于是開始瘋狂地調(diào)試,終于找到了導致崩潰的原因:
我們的Release版的EXE和DLL都是用/MT 編譯選項編譯的,也就是靜態(tài)鏈接C/C++的運行時庫,而這時,EXE和DLL各自擁有獨自的堆(Heap)空間,所以其中一方在其堆中new出來的內(nèi)存,只能由其自己來delete,否則就會產(chǎn)生問題(也就是我們碰到的崩潰...).
解決方法有很多種,我采用的方法就是改了改代碼,讓DLL delete 自己 new 出來的東西,EXE也同樣如此。測試后程序沒有出現(xiàn)問題。
-------------------------------------------------------------------------------------------
貼上幾個相關(guān)的鏈接,很有幫助:
(英文)
memory allocations in dll
Deleting memory from DLLs (C++)
(中文)
DLL和exe里的malloc和free不能混用
在DLL中用CRT靜態(tài)庫申請內(nèi)存,EXE釋放是不行的
DLL分配的內(nèi)存如何在EXE里面釋放