堆腐败,怎么办?

时间:2013-11-28 22:11:44

标签: c++ box2d sfml

我使用SFML + Box2D开发游戏并在删除Controller对象时遇到堆损坏,它会触发断点

retval = HeapFree(_crtheap, 0, pBlock);
    if (retval == 0)
    {
        errno = _get_errno_from_oserr(GetLastError());
    }

在调试时,它说它是一个堆损坏,并告诉我Alumni.exe中的0x771CE753(ntdll.dll)处的未处理异常:0xC0000374:堆已损坏(参数:0x77204270)。“

我怎么知道以前写在这个记忆地址上的内容?什么是避免堆腐败的好方法?我的指针很谨慎,我不会删除任何东西。

如果有人想花时间,那么存储库位于github.com/mrseth/Alumni。您可以按下输入一次和退格键来触发崩溃。输入生成一个Controller,退格键删除最后生成的一个。删除控制器的代码位于https://github.com/mrseth/Alumni/blob/Stephen/Alumni/Alumni/TestClickListener.cpp

1 个答案:

答案 0 :(得分:1)

我发现了问题。我在SceneNode中调用了SceneNodes上的delete,因此它在SceneNode指针上调用了delete。问题是,它可以删除它的子节点,它可以是SceneNode的子类。所以我改变了所有每个子类负责解除分配自身并解决了堆溢出问题。感谢您的见解和信息。