ryg*_*guy 6 valgrind memory-corruption visual-studio electric-fence
我最近遇到了堆腐败的第一次战斗 (已解决).在我家的linux机器上,使用valgrind和电栅栏(使用gdb),罪魁祸首代码无错误地退出.然而,在我们实验室的Windows机器上,我始终从我引用的帖子中描述了VS中与堆损坏相关的错误消息.
valgrind和电围栏不会发现这样的问题,这是否令人惊讶(或至少不常见)?其他人提到了一个可能类似的错误,在这里回答了valgrind .这些工具无法检测到此问题的原因可能是什么?有没有理由怀疑错误实际上是堆腐败?
更新:正如在描述原始问题的帖子中所提到的,我发现问题是由于指向std :: vector中的元素指针,这变得很糟糕.用std :: list替换向量(添加新元素时指针不会变为无效)修复了问题.所以回到我关于为什么valgrind没有发现问题的问题,我问是否有关于如何避免将来出现类似情况的建议,即valgrind未检测到的内存问题,这是我的一个问题最喜欢的工具 显然,更好地了解STL如何工作将是一个好主意.也许我需要在编程等方面对断言更加自信.
因此,Valgrind未能检测到您的堆损坏的明显原因是GCC STL实现完全没有发生损坏(即没有检测到错误).
不幸的是,Valgrind的运行水平远低于STL,因此很多bug仍未被发现.例如:
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.resize(0);
v[1] = 42; // Oops. Out of bounds access, but Valgrind is silent
Run Code Online (Sandbox Code Playgroud)
幸运的是,GCC STL有一个特殊的调试模式,旨在捕获许多这样的问题.尝试使用构建原始代码-D_GLIBCXX_DEBUG.它可能会遇到原始问题,并可能会遇到更多您尚未了解的问题.