谁分配谁释放HEAP
在linux下,每个进程只有一个heap,在任何一个动态库模块so中通过new或者malloc来分配内存的时候都是从这个唯一的heap中分配的,那么自然你在其它随便什么地方都可以释放。这个模型是简单的。
但是在windows下面,问题变得复杂了。
1、windows允许一个进程中有多个heap,那么这样就需要指明一块内存要在哪个heap上分配,win32的HeapAlloc函数就是这样设计的,给出一个heap的句柄,给出一个size,然后返回一个指针。每个进程都至少有一个主heap,可以通过GetProcessHeap来获得,其它的堆,可以通过GetProcessHeaps取到。同样,内存释放的时候通过HeapFree来完成,还是需要指定一个堆。
2、这样的设计显然是比较灵活的,但是问题在于这样的话,每次分配内存的时候就必须要显式的指定一个heap,对于crt中的new/malloc,显然需要特殊处理。那么如何处理就取决于crt的实现了。vc的crt是创建了一个单独的heap,叫做__crtheap,它对于用户是看不见的,但是在new/malloc的实现中,都是用HeapAlloc在这个__crtheap上分配的,也就是说malloc(size)基本上可以认为等同于HeapAlloc(__crtheap, size)(当然实际上crt内部还要维护一些内存管理的数据结构,所以并不是每次malloc都必然会触发HeapAlloc),这样new/malloc就和windows的heap机制吻合了。(这里说的是vc的crt实现,我不知道其它crt实现是否如此)
3、如果一个进程需要动态库支持,系统在加载dll的时候,在dll的启动代码_DllMainCRTStartup中,会创建这个__crtheap,所以理论上有多少个dll,就有多少个__crtheap。最后主进程的mainCRTStartup 中还会创建一个为主进程服务的__crtheap。(由于顺序总是先加载dll,然后才启动main进程,所以你可以看到各个dll的__crtheap地址比较小,而主进程的__crtheap比较大,当然排在最前面的堆是每个进程的主heap。)
4、从上面的分析中可以看出,对于crt来说,由于每个dll都有自己的heap,所以每个dll通过new/malloc分配的内存都是在自己dll内部的那个heap上用HeapAlloc来分配的,而如果你想在其它模块中释放,那么在释放的时候HeapFree就会失败了,因为各个模块的__crtheap是不一样的。
这样,基本上事情就比较清楚了,在windows下一个进程存在着多个heap,除了一个主heap外,还有很多的__crtheap,用来处理通过c/c++的运行库进行的内存操作。所以使用new/malloc来分配的内存实际上都是局部的,可以在多个dll中共享,但是却必须是谁申请谁释放。这个是windows下的一个规则。以前知道这个规则,但是不知道为什么,现在算是比较明白了。(当然如果在dll内部使用HeapAlloc(GetProcessHeap(), size)来分配的内存是可以在dll以外释放的,因为这时内存分配在全局的主heap上,而不是分配在dll自己的__crtheap上)
转载于:https://www.cnblogs.com/hgy413/archive/2011/08/24/3693604.html
谁分配谁释放HEAP相关推荐
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 2 //数组指针的内存分配和释放 3 //方法一 4 char (*a)[N];//指向数组的指针 5 a = (char (*)[N])malloc(s ...
- OpenCV分配与释放图像空间
图像处理 单通道图像灰度取值 IplImage * pSrcImage = cvLoadImage("Sunset.jpg",CV_LOAD_IMAGE_GRAYSCALE) ...
- 利用二叉树的思想来实现分配和释放内存方法
虽然大部分系统都有提供内存动态分配和释放函数(即C语言中的malloc和free函数),但是在嵌入式开发中由于系统的限制往往需要自己来实现内存管理,如在有些平台上可动态申请的最大空间不能满足程序设计的 ...
- 如何简化临时内存的分配与释放
描述:在编制 C++ 程序时,最常遇到的一个令人恼火的问题便是临时资源的分配与释放问题, 由于程序的逻辑关系通常很复杂,引发异常的可能性也很多,为了妥善处理运行时异常, 我们不得不在可能引发异常的任何 ...
- C++/C--动态二维数组的内存分配与释放【转载】
1 C语言_二维数组动态数组分配和释放 1.1 数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(cha ...
- 分配和释放 BSTR 的内存
本文档已存档,并且将不进行维护. 分配和释放 BSTR 的内存 Visual Studio .NET 2003 转自: https://msdn.microsoft. ...
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- java怎么释放分配的内存,linux 内存的分配和释放,linux分配释放
linux 内存的分配和释放,linux分配释放 了解内存分配机制(共享映射与请求分页) 通过 pmap 命令,可以获取用户进程逻辑地址空间中映射的内存信息: pmap -x $pid 其中 -x 表 ...
- C语言中多维数组的内存分配和释放(malloc与free)(转)
C语言中多维数组的内存分配和释放(malloc与free)(转) 写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误.下面贴上一些示例代码,以供参考. 如果要给二维数组( ...
- 指针分配和释放空间(转)
指针分配和释放空间(转) (2012-06-06 12:42:04) 转载▼ 标签: 指针 分类: C/Cplusplus 20.1 理解指针的两种"改变" 普通变量(非指针,简单 ...
最新文章
- 海康存储携手英特尔发布AI企业私有云
- 绝不翻车珍珠奶茶做法
- LeetCode 573. 松鼠模拟(数学)*
- 理解和使用 Unity UI 系统(canvas和CanvasScaler )
- android image 位移动画_Android共享元素转场动画实现
- Mac用brew安装mysql
- 同比增长率,环比增长速度、环比发展速度
- (解决)Circular view path [index]: would dispatch back to the current handler URL [] again. Che
- Win2003安全警报--当前安全设置不允许从该位置下载文件
- 《Proof of Federated Learning: A Novel Energy-recycling Consensus Algorithm》精读
- mysql password_expired
- 基于 OpenSSL 生成自签名证书,数字签名,泛域名证书,ca证书,PKI等
- 请求跨域设置同时允许cookie跨域(携带cookie)
- 【计算机网络】 课程大作业:利用Wireshark抓包并进行分析
- 信号频率和带宽的关系
- 适配器模式-第三方登录与设计模式的七七八八
- python的imaplib实现搜索邮件
- 以获客为目标 ,如何从0到1实现用户增长?
- 汇编语言:以GRADE为首地址的10个字的数组中保存有学生成绩。建立一个10个字的RNAK 数组,并根据GRADE中的学生成绩将学生名次填入RANK数组中
- 惯性思维与创新发现的矛盾
热门文章
- selenium.common.exceptions.WebDriverException: Message: Can't load the profile.
- VC++2010开发数字图像系统1
- ORA29902执行ODCIIndexStart()例行程序中出错 SQL空间查询ST_Geometry配置
- ASP.NET FileUpload用法
- Pytorch:Tensor(张量)的使用
- BZOJ2521[SHOI2010] 最小生成树
- 如何优化及安全设置Linux系统
- matlab多图形相交,用MATLAB作出柱面x^2+y^2=4 和柱面x^2+z^2=4 相交的图形.
- sqlserve 热备用状态更新_什么是核心交换机的链路聚合、冗余、堆叠、热备份
- python怎么利用gpu加速_python怎么利用gpu加速