因為malloc/free,new/delete都是調(diào)用HeapAlloc/HeapFree來實現(xiàn)來實現(xiàn)內(nèi)存分配是釋放的。
查看Windows的API可以看到,這兩個函數(shù)都需要一個Heap的HANDLE做為參數(shù)。CRT庫采用了全局變量來保存這個HANDLE。如果是CRT靜態(tài)鏈接,CRT庫的代碼會鏈接到各個DLL中去,也包括這個全局變量。
也就是說,每個使用CRT靜態(tài)鏈接的dll中都有一個自己的全局堆句柄,他們自己都在這個句柄上使用內(nèi)存。當(dāng)釋放dll中分配的內(nèi)存時由于使用的堆句柄不一致于是出錯。
當(dāng)使用CRT動態(tài)鏈接時,有于每個dll都是去調(diào)用CRT庫的dll函數(shù)來分配和釋放內(nèi)存的,使用的是同一個句柄,所以就沒有這個問題