malloc 分配内存的具体细节

malloc 分配内存的具体细节

http://gengyanhui111.blog.163.com/blog/static/1401502102010111544840916/

 

C++ 2010-12-15 16:48:40 阅读9 评论0  字号: 订阅

了解 C 的内存分配,就要知道,C 程序是从 OS 中请求内存的,以 Windows 为例,CRT 调用 WIN API HeapAlloc 来请求堆内存分配的,HeapAlloc 需要一个句柄,指向进程的堆,这是 OS 管理内存用的,扯远了。 

好了,现在 CRT 已经有了堆内存了,那么应用程序要在堆上请求内存怎么做呢?不用我说吧?用 malloc,而 malloc 其实调来调去,其实是调用 _heap_alloc_dbg,_heap_alloc_dbg 接受一个参数 size_t nSize 用来表示程序要分配的内存大小,以 malloc(100) 为例,此参数也就是 100,但 _heap_alloc_dbg 不是请求分配 100 字节的内存,CRT 需要维护一个_CrtMemBlockHeader 的链表,_CrtMemBlockHeader 有一个成员 nDataSize 来表示用户请求分配的内存大小,_heap_alloc_dbg 实际上就是通过 HeapAlloc 来请求分配内存的,分配大小为 sizeof(_CrtMemBlockHeader) + nSize + nNoMansLandSize,即 _CrtMemBlockHeader 结构的大小(32字节)加上用户请求的大小(100),再加上 4 字节的标志。 

好了,现在已经分配了足够的内存,难道就把所有的内存都给应用程序使用吗?当然不是,CRT 得到系统分配的内存的首地址 pHead,而给应用程序的内存实际上就是 pHead 偏移 32 字节(_CrtMemBlockHeader 的大小)所指向的地址,_heap_alloc_dbg 返回的就是这个地址。 


应用程序使用完内存之后,调用 free 函数,free 函数实际上调用的是 _free_dbg 函数,再调用_free_dbg_nolock 函数,_free_dbg_nolock 函数的第一个参数为 pUserData,即应用程序使用的内存地址,也就是 _heap_alloc_dbg 地址,也是 malloc 返回的地址,pUserData 减去 32 字节(_CrtMemBlockHeader 的大小)就是系统分配内存的首地址 pHead,通过 pHead 就可以得到一个_CrtMemBlockHeader 结构,这个结构的 nDataSize 成员就是应用程序请求的内存大小,以 malloc(100) 为例,此成员也就是 100,这样就可以计算出系统分配了多少内存,sizeof(_CrtMemBlockHeader) + 

nDataSize + nNoMansLandSize,即 32 + 100 + 4,为 136,所有可以正确释放分配的内存。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值