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