在C ++ GUI中查找内存错误

时间:2012-01-11 04:35:09

标签: c++ heap-corruption

或者至少我认为问题涉及某种内存错误。我正在使用SFML制作一个程序,而我目前正在使用我为SFML制作的GUI类来处理菜单。在内部,GUI类使用std :: shared_ptr来管理其所有内部指针。在main()退出并且所有全局析构函数都被调用之后,程序一直崩溃,gdb说在ntdll中触发了一个断点!WaitForAlpCompletion,这让我相信问题是内存损坏。每当我从菜单功能中删除GUI实例时,它都会退出并关闭,没有错误。这似乎表明GUI是崩溃的原因,除了可以调用和退出创建和销毁自己的GUI实例的子菜单,而不会出现任何崩溃或断点。

一些伪代码:

SubMenu
{
    Create GUI
        Do Menu
    Destroy GUI
}

Menu
{
    Create GUI
        Do Menu?SubMenu
    Destroy GUI
}

main
{
    Init Stuff
    Menu
    UnInit Stuff
    Destroy GUI
    return 0
}

//after return
Global Dtors
Breakpoint triggered???

我对这可能是什么感到茫然。我计划今天在某个时候使用像valgrind这样的内存调试器,但我想知道是否有其他人对这可能是什么有任何想法。

2 个答案:

答案 0 :(得分:2)

终于想通了!!!!!事实证明,每次重新调整大小时,std :: map都会调用其对象的析构函数,从而导致shared_ptr内部多次删除它们的数据。一些“快速”设计变更并修复:)谢谢你们!

答案 1 :(得分:0)

此代码可能导致堆损坏:

int main()
{
    int *A(new(std::nothrow) int(10));
    int *B(A);

    delete B;
    delete A;
}

您的任何代码是否包含类似的情况?