2

这完全让我感到困惑。在我的班级声明中,我有两行:

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

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

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

看起来很简单,只不过和后面两个变量的处理方式无关。我删除了其余代码中对变量的所有引用 - 仍然崩溃。我注释掉了其中一行 - 任何一行,程序运行没有问题。错误怎么可能不与任何一个特定变量有关?我在假设 STL 中没有错误的情况下工作,但我已经没有关于我的代码如何可能做到这一点的想法。

这让我很困惑,所以我很感激你能提供的任何帮助。怀亚特

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

我的代码有几千行,所以不值得任何人花时间阅读它,我只是在寻找能指引我正确方向的人。

4

2 回答 2

7

您认为问题不在 GCC 或 STL 中是正确的。但是,如果映射导致free错误,则您的其他代码可能是堆栈粉碎(或堆粉碎)。一个真正可怕的错误追赶。堆栈粉碎最糟糕的部分是破坏的对象不是有错误的对象。

这里有一些调试技巧。

  • 在valgrind下运行应用程序。
  • 定义_GLIBCXX_DEBUG启用stl调试
  • 添加MALLOC_CHECK_=1为环境变量。这将为您提供更好的 malloc 错误消息。更多信息在这里
  • 在极少数情况下,我能够在将要被打碎的位置添加一个记忆手表。但是,很少有人能够预测粉碎将发生在哪里。
于 2010-07-13T15:57:07.770 回答
2

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

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

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

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

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

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

于 2010-07-13T15:51:06.170 回答