专业服务好的网站设计制作,成都家装公司,腾讯云服务器怎么用,网站开发运营策划案linux一个进程只有一个堆#xff0c;不要考虑这些问题#xff0c;但是windows一个进程可能有多个堆#xff0c;要在对应的堆上释放。
一#xff0c; MT改MD
一个进程的地址空间是由一个可执行模块和多个DLL模块构成的#xff0c;这些模块中#xff0c;有些可能会链接到…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);if (pData NULL)return NULL;//使用的是HEAP_ZERO_MEMORY会自动把内存块的内容都清零//下面这行代码可以不要的memset(pData, 0, 100);char pBuf[] 十点十分十分十分;memcpy(pData, pBuf, sizeof(pBuf));*len 100;return pData;
}可执行程序
int main()
{HMODULE hLib LoadLibraryA(Dll1.dll);if (nullptr hLib){std::cout LoadLibraryA fail, error: GetLastError() std::endl;return 0;}Fun fun (Fun)GetProcAddress(hLib, Test);if (nullptr fun){std::cout GetProcAddress fail, error: GetLastError() std::endl;return 0;}int nLen 0;char *pData (char*)fun(nLen);std::string strTemp(pData, nLen);HeapFree(GetProcessHeap(), 0, pData);std::cout strTemp std::endl;return 0;
}windows允许一个进程中有多个heap那么这样就需要指明一块内存要在哪个heap上分配win32的HeapAlloc函数就是这样设计的给出一个heap的句柄给出一个size然后返回一个指针。每个进程都至少有一个主heap可以通过GetProcessHeap来获得其它的堆可以通过GetProcessHeaps取到。同样内存释放的时候通过HeapFree来完成还是需要指定一个堆。