<1>linux下每个进程只有一个heap,在任何一个动态库模块so中通过new或者malloc来分配内存的时候都是从这个唯一的heap中分配的,那么自然你在其他随便什么地方都可以释放

<2>但在windows下面就复杂了

(1)windows允许一个进程有多个heap,那么这样就需要指明一块内存要在那个heap上分配的,win32HeapAlloc函数就是这样,给出一个heap的句柄,给出一个size,然后返回一个指针。每个进程都至少有一个主heap,可以通过GetProcessHeap来获得,其他的堆可以通过GetProcessHeaps取到。同样内存释放需要指定一个堆通过HeapFree来完成

(2)如果一个进程需要动态库支持,系统在加载dll的时候,dll启动代码_DllMainCRTStartup中,会创建这个__crtheap,所以理论上有多少个dll,就有多少个__crtheap。最后主进程的mainCRTStartup中还会创建一个为主进程服务的__crtheap

(3)由于总是先加载dll,然后才启动main进程,所以各个dll__crtheap地址比较小,而主进程的__crtheap比较大,当然排在最前面的堆是每个进程的主heap

       (4)从上面的分析可以看出,每个dll都有自己的heap,所以不能交叉分配释放。所以使用new/malloc来分配的内存实际上都是局部的,但是可以在多个dll中共享。当然如果再dll内部使用HeapAlloc(GetProcessHeap(), size)在主heap上分配内存,因此可以在dll以外释放