<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之外释放指针