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