問題:如果程序的模塊中有一個鏈接到靜態C/C++運行期庫,那么在這個模塊中分配內存而在另一個模塊中釋放這塊內存將失敗。

原因:造成失敗的原因是分配和釋放內存不是由相同的堆管理程序完成的,例如動態鏈接庫中的堆在默認情 況下是由msvcrt.dll中的堆管理程序管理的(以動態鏈接的方式),而exe程序的堆在默認情況下是由程序自己的代碼管理(以靜態鏈接的方式),由 于它們的堆管理程序不同,當動態鏈接庫分配的內存在exe程序中釋放時就會出錯,因為exe程序所在的堆并沒有分配這塊內存,而你卻要求它釋放這塊內存。

解決方法:將程序中所有的模塊都鏈接到C/C++運行期庫Multithreaded DLL,修改后所有分配和釋放堆上內存的操作都由同一個堆管理程序管理,這樣便解決了問題。

注意:VC6中的STL在DLL和程序之間傳遞會出錯。MS建議升級到更高版本或使用第三方STL。