linux一个进程只有一个堆,不要考虑这些问题,但是windows一个进程可能有多个堆,要在对应的堆上释放。
一, MT改MD
一个进程的地址空间是由一个可执行模块和多个DLL模块构成的,这些模块中,有些可能会链接到C/C++运行库的静态版本,有些可能会链接到C/C++运行库的DLL版本。当使用运行库的DLL版本时,由于dll加载到进程中只会在地址空间中存有一份,因此共用的是同一个堆。所以将可执行模块和DLL模块统一修改为MD编译,则可以直接实现跨模块之间的内存申请和释放,而不会存在任何问题。
二, DLL提供释放接口
每个模块自己封装好释放对应内存的接口,分配资源的接口和释放资源的接口成对封装吧,然后外部模块调用就好了。
三, 使用主进程堆申请和释放内存
如果非要A模块申请的内存,B模块来释放,并且A模块还没有对应的接口,那就大家都使用一个堆就好了,申请和释放都用GetProcessHeap()指定好使用主进程堆。
DLL:
```cpp
void* __stdcall Test(int *len)
{
void* pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100);