Memory 为什么malloc/new会返回指向块中间的指针?
一般背景: 我试图分析发生堆损坏的转储。堆损坏发生在std::vector.push_back中-当超过向量容量且需要更多空间时,调用旧向量的“free”失败 分析详情:Memory 为什么malloc/new会返回指向块中间的指针?,memory,vector,heap,corruption,Memory,Vector,Heap,Corruption,一般背景: 我试图分析发生堆损坏的转储。堆损坏发生在std::vector.push_back中-当超过向量容量且需要更多空间时,调用旧向量的“free”失败 分析详情: 从转储的分析中,我看到“释放”的指针位于一个现有的“HeaPixEnter”块的中间。我通过使用“!heap-h”枚举相关堆的所有块,发现空闲块位于两个现有块之间(它们之间的差异非常显著,当然不仅仅是8-16字节的元数据,或者类似的东西) 问题: 以前的堆损坏是否会导致堆管理器将地址返回到块的中间,从而在尝试释放它时必然导致崩
从转储的分析中,我看到“释放”的指针位于一个现有的“HeaPixEnter”块的中间。我通过使用“!heap-h”枚举相关堆的所有块,发现空闲块位于两个现有块之间(它们之间的差异非常显著,当然不仅仅是8-16字节的元数据,或者类似的东西)
问题:Amit我猜它是一个过时的指针,听起来它可能在过去被有效地分配了,但可能在过去也被释放了,然后被一个更大的块分配了
在这种情况下,问题是双重自由。如果您的代码是多线程的,则可能是一个线程安全问题,导致指针过时。您最好使用工具来跟踪错误的线索
- 瓦尔格林相当不错
- 一些操作系统具有内置的malloc()诊断功能,可以通过环境变量动态启用,无需额外努力。检查系统上malloc()的手册页