<1>linux下每一個進程只有一個heap,在任何一個動態庫模塊so中經過new或者malloc來分配內存的時候都是從這個惟一的heap中分配的,那麼天然你在其餘隨便什麼地方均可以釋放linux
<2>但在windows下面就複雜了windows
(1)windows容許一個進程有多個heap,那麼這樣就須要指明一塊內存要在那個heap上分配的,win32的HeapAlloc函數就是這樣,給出一個heap的句柄,給出一個size,而後返回一個指針。每一個進程都至少有一個主heap,能夠經過GetProcessHeap來得到,其餘的堆能夠經過GetProcessHeaps取到。一樣內存釋放須要指定一個堆經過HeapFree來完成ide
(2)若是一個進程須要動態庫支持,系統在加載dll的時候,dll啓動代碼_DllMainCRTStartup中,會建立這個__crtheap,因此理論上有多少個dll,就有多少個__crtheap。最後主進程的mainCRTStartup中還會建立一個爲主進程服務的__crtheap。函數
(3)因爲老是先加載dll,而後才啓動main進程,因此各個dll的__crtheap地址比較小,而主進程的__crtheap比較大,固然排在最前面的堆是每一個進程的主heap。spa
(4)從上面的分析能夠看出,每一個dll都有本身的heap,因此不能交叉分配釋放。因此使用new/malloc來分配的內存實際上都是局部的,可是能夠在多個dll中共享。固然若是再dll內部使用HeapAlloc(GetProcessHeap(), size)在主heap上分配內存,所以能夠在dll之外釋放指針