我什至不知道从哪里开始...当我关闭程序时,Visual Studio不断给我一个堆损坏错误。折断的位置各不相同。在40多个小时中,我花了95%的时间更改代码(删除智能指针,删除实现隐藏,重新添加智能指针,使每个类均不可复制,将析构函数设为私有(private)等)堆栈与boost::shared_ptr和std::shared_ptr有关(我在它们之间进行切换以查看是否有帮助),大约是与shared_ptr删除CLevel类有关的时间为75%。
在我将析构函数设为私有(private)并创建了删除它们的函数之后,我想我将其范围缩小到调用指向CLevel的指针上的delete。大概有50%的时间是在致电之后,它给了我错误。我进入CLevel,观察每个变量以确保将其删除,然后,代码下降到基类中并退出,正是在退出时弹出了堆错误。但是我无法弄清楚什么地方出了问题,此外,它并没有总是给出错误。有时它在之后抛出错误,我之前也相信。这使得发现问题变得非常困难,尤其是因为它发生在其他类中(我认为只是CEntity或CEntityManager)。
我本来以为Boost会做些奇怪的事情,因为从类实现中删除了智能指针之后,相反,当我请求一个类的新实例(特定于CLevel和CEntity)时,程序在Application之后给出了错误.run()退出(智能指针在运行内部)。调用堆栈显示错误发生在“标量删除析构函数”之后或之后。
很多时候,这次休息都是免费的。c。到目前为止,它位于realloc.c。第85行。这个错误就像一个月的搁置,我对尝试修复它感到厌倦,我决定在程序退出时不删除任何类,但是我真的不想那样做,如果我想要的话以后发生的事情会在退出时发生吗?几分钟前,该错误在退出时发生了两次。其中一个似乎与指向ALLEGRO_EVENT_QUEUE和ALLEGRO_TIMER的智能指针有关,我使它们成为常规指针并手动删除了它们,而第二个则消失了。
现在,这是调用堆栈:
这是我认为涉及deleter函数的代码(注意:该函数在一个月前首次出现时就不存在。)
void PN::CLevelManager::destroyLevel(const pLevel _ptr)
{
assert(LevelMgr.get() != NULL);
std::cout << std::endl << LevelMgr.get();
auto iter = std::find(LevelMgr->m_levelList.begin(), LevelMgr->m_levelList.end(), _ptr);
if (iter != LevelMgr->m_levelList.end())
LevelMgr->m_levelList.erase(iter);
delete _ptr;
}
还有其他喜欢它的人。
这是我的完整代码(很多):https://github.com/NaturalDre/Nairim
我是一个自学成才的程序员,因此,如果代码看起来很糟糕或结构不正确,我深表歉意。
如果有人指出我这个问题,那就太好了。这种东西使我沮丧。我喜欢计算机,因为一切都是固定的,而不是可变的(如果这样做,即使这不是您期望的,也会发生)。这个错误跳来跳去,类似的东西使我发疯。并且程序中没有相关数据被修改。 CLevel只是读取文件,创建 map ,然后在必要时绘制它。
另外,请记住,我正在快速更改很多东西,因此有些事情可能看起来很奇怪或尚未完全实现。
最佳答案
是时候忙着WinDbg,GFlags, and AppVerifier了。这些工具可以使程序更早崩溃,并允许您闯入调试器以查看发生内存损坏的位置。
关于c++ - 堆腐败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7373685/