C++的内存管理
2021-03-06 05:28
heap_alloc_new_group()
1MB
分为32个单元,每单元32KB
的大小。然后每一个单元又分为8个page
,每部分4KB
——对应操作系统的page
。而管理中心region
一共有32个group
,所以每一个group
管理8x4KB的内存资源。
从上面的代码中可以知道:一个group
共有64个双向指针,这些指针所管理的内存按照16的倍数递增(即1st—16字节,2nd—32字节...64th—>=1024字节)。 因此一个group
实际上可以管理的大小是16*(1 + 2 + ...+ 64) = 32KB + 512Bytes
。符合最开始的设定。
根据ioinit
申请的内存大小110h
,加上debug
模块和cookie
,再进行16字节的对齐。最后需要向每一个page
申请130h
字节的内存。最后还剩下ec0h = ff0h - 130h
。那一个page
便会被切割成为两部分——一部分是分配的130h
内存,这一部分需要将130h
改为131h
代表脱离了SBH系统的控制分离出去。 另一部分是剩下的ec0h
。双方的结构都是heap_alloc_dbg::struce _CrtMemBlockHeader
并且都需要更新cookie
。以后每一次分配都需要根据分配的size
计算所挂的链表——如果该链表上没有区块,则向上移动直到最后一条链表上再分配。
至此,malloc
函数的整个分配过程基本结束了。