2011-09-01 59 views
2

当我运行我的程序它偶尔会崩溃,给我这个错误: “glibc的检测/pathtoexecutable:免费():无效的下一个尺寸(快速)”“vectoribush_back”上的“glibc free():无效的下一个尺寸(快速)”?

回溯导致成员函数只是调用一个载体的作用的push_back -

void Path::add(Position p) {path.push_back(p);} 

我曾尝试使用Google的错误,并且很大部分的问题都是人分配内存太少。但是,这怎么可能发生在std :: vector <> .push_back?我可以检查什么?任何帮助表示赞赏。

回答

8

您可能在某处做了无效写入操作,并且废除了glibc保存的用于簿记的控制信息。因此,当它试图释放事物时,它会检测到异常情况(不合理的大小以释放)。

这种事情最糟糕的是,这个问题并没有体现在你犯了真正错误的地步,因此很难赶上(这是一个常见错误)。

最好的办法是使用内存调试器。 valgrind可能是一个开始(因为你提到glibc)。在glibc消息之前寻找“大小写无效”。

+2

valgrind太棒了 –

2

正如@cniculat所说,尝试valgrind。

你可以尝试另一个工具是:

  • GCC STL调试支持。如果在STL容器的错误使用中出现问题,使用 D_GLIBCXX_DEBUG和-D_GLIBCXX_DEBUG_PEDANTIC编译的tahn可能会发现问题。如果发现问题,程序将被中止assert(),因此您将在控制台上收到错误消息。
  • 还有一种选择是使用谷歌tcmalloc。它优先于malloc()/free()。只需将您的appl与tcmalloc链接版本链接起来,即可检测雾状记忆体使用问题。

STL调试支持和tcmalloc可以在常规中使用调试构建。这样你就可以像常规一样工作,而这些工具会在“后台”声明你是否有错误。

+0

谢谢,这些宏帮助了很多:) – AkiRoss

相关问题