![]() |
1
6
它非常依赖于内存分配器本身的实现,更不用说任何依赖于应用程序的故障,比如覆盖某个对象的v-table。有许多内存分配器方案,它们在功能和对double free()的抵抗力上都有所不同,但它们都有一个共同的特性:应用程序在第二次free()之后的某个时间会崩溃。 崩溃的原因通常是内存分配器在每个分配的内存块之前(页眉)和之后(页脚)专门使用少量内存来存储一些特定于实现的细节。头文件通常定义块的大小和下一个块的地址。页脚通常是指向块头的指针。删除两次通常至少需要检查相邻的块是否空闲。因此,如果出现以下情况,程序将崩溃: 1) 指向下一个区块的指针已被覆盖,第二个free()在尝试访问下一个区块时会导致segfault。 2) 上一个区块的页脚已被修改,访问上一个区块的页眉会导致segfault。 如果应用程序存活下来,这意味着free()在不同的位置有损坏的内存,或者将添加与一个已经可用的块重叠的可用块,从而在将来导致数据损坏。最终,您的程序将在涉及损坏的内存区域的以下free()或malloc()之一处出错。 |
![]() |
2
6
|
![]() |
3
1
通过执行
如果有派生类,则不要对派生类(子类)调用delete。如果未声明为虚拟,则只有
|