“glibc free():在vector.push_back上无效下一个大小(快)”

时间:2011-09-01 20:49:30

标签: c++ memory-management stdvector glibc

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

回溯导致成员函数只调用向量的push_back函数 -

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

我试过谷歌搜索错误,而绝大多数问题是人们分配的内存太少。但是怎么可能在std :: vector<> .push_back上发生?我可以检查什么?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:8)

你可能在某处做了无效的写操作并且将glibc保存的控制信息丢弃用于簿记。因此,当它试图释放东西时,它会检测到异常情况(不合理的尺寸可以自由)。

这类事情最糟糕的是,问题并没有表现在你犯了真正错误的地步,所以很难抓住(这是一个非常常见的错误)

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

答案 1 :(得分:2)

正如@cniculat所说,试试valgrind。

您可以尝试的另一个工具是:

  • gcc stl debug支持。如果在STL容器的错误使用中出现问题,请编译 D_GLIBCXX_DEBUG和-D_GLIBCXX_DEBUG_PEDANTIC可能会揭示问题。如果发现问题,程序将被assert()中止,因此您将在控制台上收到错误消息。
  • 另一种选择是使用谷歌tcmalloc。它会覆盖malloc() / free()。只需将您的appl链接到tcmalloc链接版本,它就可以检测到内存使用问题。

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