C++内存管理(候捷)第三讲 笔记

VC6和VC10的malloc比较

在这里插入图片描述
调用栈,从下往上
mainCRTStartup函数是CRT(C Run Time,C标准库)提供的入口点函数 ,调用一系列函数,后面才是调用main函数
_heap_alloc_base函数,当size小于一个阈值_sbh_thrshold时调用__sbh_alloc_block函数,否则调用HeapAlloc函数,后者是操作系统提供的内存分配函数
在这里插入图片描述
不再做门槛检测,无论多大内存,都交给操作系统申请,对于VC10版本,它的SHB等小块内存的管理都被包装到HeapAlloc里面来了。
在这里插入图片描述
_heap_init里面调用HeapCreate来分配一块大小为4096的堆空间,命名为_crtheap,后面CRT的动作都要从这一块内存中来拿
_heap_init里面调用__sbh_heap_init,里面时HeapAlloc,从_crtheap中拿内存,准备好16个header
所以 _heap_init的作用就是准备好16个header
在这里插入图片描述
其中的一个head结构,hi和lo组合共64位,下面一行,commit32位是上面一行

vc6内存分配

在这里插入图片描述
CRT进行的第一次内存分配,调用了_malloc_crt进行内存分配。分配的大小为32 x 8 = 256B,所有的程序一进来都是分配256B。256在十六进制下是0x100,或者写成100H
_malloc_dbg 是与调试相关的内存分配函数,它是 Microsoft Visual C++ 提供的一种扩展版本,用于在调试模式下进行内存分配,并提供额外的调试信息
在这里插入图片描述
之后调用_heap_alloc_dbg,里面右下角计算blockSize的时候,_CrtMemBlockHeader是一个结构体,可以称为debug header,nSize就是上文提到的256B,后面的nNoManLandSize是4
在这里插入图片描述
_pFirstBlock和_pLastBlock两根指针指向block链表的头尾。malloc分配的内存块都用链表串起来
调试模式下多了(右上图)深灰色之外的东西

上图右下角的memset是给特定地方填入特定的值
在这里插入图片描述
_heap_alloc_base分配内存,把刚刚扩充的大小在去比较,小于阈值的内存交给sbh服务,大于阈值的内存交给操作系统HeapAlloc来服务。
这里_Sbh_threshold的值是1016,因为还没有加cookie(大小为8),两者加起来是1024B
在这里插入图片描述
在前面block的大小(intSize)基础上,上下添加cookie(2*sizeof(int),以及右侧上下两块红色的地方0x131)。(BYTE_P

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值