定义两个multimaps的C ++会导致程序崩溃

时间:2010-07-13 15:43:16

标签: c++ stl multimap

这让我完全不知所措。在我的课堂宣言中,我有两行:

std::multimap<int, int> commands;
std::multimap<std::string, std::string> config;

代码编译没有问题,但是当我运行它时,我收到以下错误:

*** glibc detected *** ./antares: free(): invalid pointer: 0xb5ac1b64 ***

看起来很简单,除了它与以后如何处理这两个变量无关。我删除了其余代码中的所有引用到变量 - 仍然崩溃。我评论了其中一行 - 任何一行,程序运行没有问题。如何将错误与特定变量无关?我的工作是假设STL中没有错误,但我已经没有关于我的代码可能如何做到这一点的想法。

这个让我难过,所以我很感激你能提供的任何帮助。 悦

编辑:我不是说STL有问题,那只是我有点油腻。我知道这个bug存在于我的代码中,我想知道的是 - 声明一个未引用的变量会导致它崩溃可能是错误的吗?为什么这会影响我的代码呢?

我的代码长达几千行,所以不值得任何人阅读它的时间,我只是想找人指点我正确的方向。

2 个答案:

答案 0 :(得分:7)

你认为问题不在GCC或STL中是正确的。但是,如果地图导致free错误,则您的其他代码可能会堆栈粉碎(或堆碎)。追逐真正可怕的虫子。关于堆栈粉碎的最糟糕的部分是破坏的对象不是bug的对象。

以下是一些调试技巧。

  • valgrind
  • 下运行该应用
  • 定义_GLIBCXX_DEBUG以启用stl调试
  • 添加MALLOC_CHECK_=1作为环境变量。这将为您提供更好的malloc错误消息。更多信息here
  • 在极少数情况下,我能够将memory watch添加到将被粉碎的位置。但是,当您可以预测粉碎将在何处发生时很少见。

答案 1 :(得分:2)

你是对的:崩溃不是来自这两行 - 它们只是让它可见。

以下是诊断此问题的方法:

  • 首先,保留定义的变量(使程序崩溃)

  • 第二步,删除或禁用代码的其他部分,直到崩溃停止发生。然后你会知道一个破坏你记忆的大致区域。

  • 第三个(一旦你有一个区域,当被禁用时停止崩溃)开始启用它的一部分,直到再次发生崩溃。

编辑:我说你的问题是包含两个多图的代码(缺少复制构造函数或赋值运算符或类似的东西)。这只是一个疯狂的猜测,所以不要把太多的股票放在上面。