怎么做潮牌网站,wordpress目录content,wordpress的restapi,零基础视频制作剪辑培训此文章用于详细介绍malloc_consolidate。
众所周知#xff0c;fastbin一般是不能合并#xff0c;但在malloc_consolidate中是个例外。
1.触发机制 首先构造这样的堆块结构
一个0x40的堆块在fastbin中#xff0c;一个0x110的堆块在unbin中
随后我们尝试分配一个0x300的堆…此文章用于详细介绍malloc_consolidate。
众所周知fastbin一般是不能合并但在malloc_consolidate中是个例外。
1.触发机制 首先构造这样的堆块结构
一个0x40的堆块在fastbin中一个0x110的堆块在unbin中
随后我们尝试分配一个0x300的堆块。 可以看到0x110的usbin被丢到了smallbin中fastbin没有被合并
但我们试着改成分配0x500的堆块。 可以看到fastbin和usbin完成了合并并被放到了smallbin中。
得出结论当你malloc一个大于smallbin的堆块它会将fastbin拿到usbin中让它尝试与周围的堆块合并如果没被分配就扔到适当的bin中。
这里可能有人会有疑惑如果fastbin不能合并是否还会被分配到smallbin中fastbin之间在这种情况下能否合并
开始试验 这次我们只free一个fastbin然后再尝试malloc(0x500以下是结果。 可以看到即使fastbin不参与合并也会被先被拉进usbin然后被扔到smallbin中。
接下来进行第二个实验 我们先释放了2个fastbin然后再尝试malloc(0x500)以下是结果 即使是fastbin之间也会进行合并
2.补充
之前一直以为fastbin自身的pre_inuse一直是1所以一直在想合并的时候fastbin怎么识别前面的chunk是不是freechunk。
但经过试验发现当前面的chunk是freechunk并且不是fastbin的时候自身的pre_inuse为0只是不参与合并。
当一个chunk被free时若它属于fastbin则它的下一个chunk的pre_inuse位不会被改变。