Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 为什么malloc/new会返回指向块中间的指针?_Memory_Vector_Heap_Corruption - Fatal编程技术网

Memory 为什么malloc/new会返回指向块中间的指针?

Memory 为什么malloc/new会返回指向块中间的指针?,memory,vector,heap,corruption,Memory,Vector,Heap,Corruption,一般背景: 我试图分析发生堆损坏的转储。堆损坏发生在std::vector.push_back中-当超过向量容量且需要更多空间时,调用旧向量的“free”失败 分析详情: 从转储的分析中,我看到“释放”的指针位于一个现有的“HeaPixEnter”块的中间。我通过使用“!heap-h”枚举相关堆的所有块,发现空闲块位于两个现有块之间(它们之间的差异非常显著,当然不仅仅是8-16字节的元数据,或者类似的东西) 问题: 以前的堆损坏是否会导致堆管理器将地址返回到块的中间,从而在尝试释放它时必然导致崩

一般背景:

我试图分析发生堆损坏的转储。堆损坏发生在std::vector.push_back中-当超过向量容量且需要更多空间时,调用旧向量的“free”失败

分析详情:

从转储的分析中,我看到“释放”的指针位于一个现有的“HeaPixEnter”块的中间。我通过使用“!heap-h”枚举相关堆的所有块,发现空闲块位于两个现有块之间(它们之间的差异非常显著,当然不仅仅是8-16字节的元数据,或者类似的东西)

问题:

  • 以前的堆损坏是否会导致堆管理器将地址返回到块的中间,从而在尝试释放它时必然导致崩溃
  • 如果1。是的,这意味着在这里使用pageheap不是很有用,因为损坏似乎发生在总是可写的数据上,所以我认为pageheap(gflags选项)无法检测到这一点。你有什么建议可以让我抓住这种腐败的发生点吗
  • 非常感谢,
    Amit

    我猜它是一个过时的指针,听起来它可能在过去被有效地分配了,但可能在过去也被释放了,然后被一个更大的块分配了


    在这种情况下,问题是双重自由。如果您的代码是多线程的,则可能是一个线程安全问题,导致指针过时。

    您最好使用工具来跟踪错误的线索

    • 瓦尔格林相当不错

    • 一些操作系统具有内置的malloc()诊断功能,可以通过环境变量动态启用,无需额外努力。检查系统上malloc()的手册页


    双重释放可能会导致后面的“malloc”返回错误指针的情况,例如:指向更大块的中间?可能,但这不是我的猜测。我猜你有:a=malloc();免费(a);b=malloc();免费(a);我知道这已经有很长一段时间了,但如果有人觉得它有用,我最终还是通过gflags.exe的“完整页面堆”选项找到了问题(单击此处了解更多信息)。