这让我完全不知所措。在我的课堂宣言中,我有两行:
std::multimap<int, int> commands;
std::multimap<std::string, std::string> config;
代码编译没有问题,但是当我运行它时,我收到以下错误:
*** glibc detected *** ./antares: free(): invalid pointer: 0xb5ac1b64 ***
看起来很简单,除了它与以后如何处理这两个变量无关。我删除了其余代码中的所有引用到变量 - 仍然崩溃。我评论了其中一行 - 任何一行,程序运行没有问题。如何将错误与特定变量无关?我的工作是假设STL中没有错误,但我已经没有关于我的代码可能如何做到这一点的想法。
这个让我难过,所以我很感激你能提供的任何帮助。 悦
编辑:我不是说STL有问题,那只是我有点油腻。我知道这个bug存在于我的代码中,我想知道的是 - 声明一个未引用的变量会导致它崩溃可能是错误的吗?为什么这会影响我的代码呢?我的代码长达几千行,所以不值得任何人阅读它的时间,我只是想找人指点我正确的方向。
答案 0 :(得分:7)
你认为问题不在GCC或STL中是正确的。但是,如果地图导致free
错误,则您的其他代码可能会堆栈粉碎(或堆碎)。追逐真正可怕的虫子。关于堆栈粉碎的最糟糕的部分是破坏的对象不是bug的对象。
以下是一些调试技巧。
_GLIBCXX_DEBUG
以启用stl调试MALLOC_CHECK_=1
作为环境变量。这将为您提供更好的malloc错误消息。更多信息here。答案 1 :(得分:2)
你是对的:崩溃不是来自这两行 - 它们只是让它可见。
以下是诊断此问题的方法:
首先,保留定义的变量(使程序崩溃)
第二步,删除或禁用代码的其他部分,直到崩溃停止发生。然后你会知道一个破坏你记忆的大致区域。
第三个(一旦你有一个区域,当被禁用时停止崩溃)开始启用它的一部分,直到再次发生崩溃。
编辑:我说你的问题是包含两个多图的代码(缺少复制构造函数或赋值运算符或类似的东西)。这只是一个疯狂的猜测,所以不要把太多的股票放在上面。