c++内存管理10-winmain/main之前你所不知道的事02

winmain/main之前你所不知道的事02

先看下图:
在这里插入图片描述
上一节,我们详细介绍了_heap_init(…),_sbh_heap_init(),接下来我们先看
1._ioinit()->_malloc_crt(debug):
如上图,右边矩形框中是它的部分源码,其实也就是为了分配内存,但这个分配内存的工具
_malloc_crt(…)有两个,一个非debug模式下,如有上角的#define _malloc_crt malloc,还有一个是debug模式下, 而在_ioint()中的malloc_crt就是我们所要讲的就是debug模式下的。
如图,已经将结构体大小标出,其中ioinfo,元素占6个字节,但编译器调整为8字节对齐。所以每个程序进入此函数之后都会分配256个字节。16进制是0x100。
2.接下来我们继续看_heap_alloc_dbg(…)
在这里插入图片描述
随着箭头指引的方向,我们可以看到它部分的源码,其中第一行,nSize就是刚刚分配的256个字节,而后面那个是个宏定义4,叫做无人区的大小(侯捷叫法)。而_CrtMemBlockHader的结构如上,其实分配器分配256个字节后编译器还有继续调整大小,在这个函数里就是在做空间大小的调整工作,如右图的矩形框,1-8分别对应结构体的8个变量,其中你nsize是256,后面的是无人区大小4。
在这里前两个指针是没有分配内存的。
szFileName,代表是从哪个文件发起申请内存的
nLine带表的是这个文件的第几行,在这里是ioint.c文件发起的,第81行申请的内存。
nDataSize代表的是真正的内存大小,也就是我们分配的256个字节,100H.
lRequest 流水号
gap 在后面的代码中将会填写一些值
其中上下gap,就相当于篱笆、栏杆保护中间的真正内存,避免超过边界。
然后blockSize就是附加了之后的大小。接下来重新分配大小。
3._heap_alloc_base():
这个函数实现重新分配内存,这个内存的大小就是调整后打大小。

发布了65 篇原创文章 · 获赞 6 · 访问量 1536

猜你喜欢

转载自blog.csdn.net/FairLikeSnow/article/details/103866834