問題:如果程序的模塊中有一個(gè)鏈接到靜態(tài)C/C++運(yùn)行期庫,那么在這個(gè)模塊中分配內(nèi)存而在另一個(gè)模塊中釋放這塊內(nèi)存將失敗。
原因:造成失敗的原因是分配和釋放內(nèi)存不是由相同的堆管理程序完成的,例如動(dòng)態(tài)鏈接庫中的堆在默認(rèn)情
況下是由msvcrt.dll中的堆管理程序管理的(以動(dòng)態(tài)鏈接的方式),而exe程序的堆在默認(rèn)情況下是由程序自己的代碼管理(以靜態(tài)鏈接的方式),由
于它們的堆管理程序不同,當(dāng)動(dòng)態(tài)鏈接庫分配的內(nèi)存在exe程序中釋放時(shí)就會(huì)出錯(cuò),因?yàn)閑xe程序所在的堆并沒有分配這塊內(nèi)存,而你卻要求它釋放這塊內(nèi)存。
解決方法:將程序中所有的模塊都鏈接到C/C++運(yùn)行期庫Multithreaded DLL,修改后所有分配和釋放堆上內(nèi)存的操作都由同一個(gè)堆管理程序管理,這樣便解決了問題。
注意:VC6中的STL在DLL和程序之間傳遞會(huì)出錯(cuò)。MS建議升級(jí)到更高版本或使用第三方STL。