C++跨模块释放内存

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来完成,还是需要指定一个堆。

相关推荐

  1. C++模块释放

    2024-02-23 17:52:05       43 阅读
  2. 释放无用的

    2024-02-23 17:52:05       34 阅读
  3. C++动态

    2024-02-23 17:52:05       52 阅读
  4. C# 共享

    2024-02-23 17:52:05       27 阅读
  5. c++ 动态分配

    2024-02-23 17:52:05       38 阅读
  6. C语言共享

    2024-02-23 17:52:05       32 阅读
  7. c++ 函数对象的释放

    2024-02-23 17:52:05       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-23 17:52:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-23 17:52:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-23 17:52:05       87 阅读
  4. Python语言-面向对象

    2024-02-23 17:52:05       96 阅读

热门阅读

  1. 智能家居现状分析及未来展望

    2024-02-23 17:52:05       54 阅读
  2. Vue2和Vue3的区别

    2024-02-23 17:52:05       48 阅读
  3. 通过SSH 可以访问Ubuntu Desktop吗?

    2024-02-23 17:52:05       46 阅读
  4. 排序算法:冒泡排序

    2024-02-23 17:52:05       44 阅读
  5. 快速了解eBay被封号的原因以及卖家申诉的方法!

    2024-02-23 17:52:05       136 阅读
  6. 【数据结构和算法】链表的简单实现

    2024-02-23 17:52:05       66 阅读
  7. Oracle 总结

    2024-02-23 17:52:05       64 阅读
  8. CSS:BFC

    CSS:BFC

    2024-02-23 17:52:05      49 阅读