我最近遇到了与堆损坏的第一场战斗 (已解决) 。在我家里的 linux 机器上,罪魁祸首代码使用 valgrind 和电栅栏(使用 gdb)没有错误地退出。然而,在我们实验室的 Windows 机器上,我一直从我引用的帖子中描述的 VS 中获得与堆损坏相关的错误消息。
valgrind 和电栅栏没有检测到这样的问题是否令人惊讶(或至少不常见)?其他人在此处的答案中提到了一个可能与 valgrind 相似的错误。这些工具无法检测到此问题的原因可能是什么?是否有任何理由怀疑错误实际上是堆损坏?
更新:正如描述原始问题的帖子中所述,我发现问题是由于指向 std::vector 中的元素的指针,这变得很糟糕。用 std::list 替换向量(添加新元素时指针不会变为无效)解决了这个问题。所以回到我关于为什么 valgrind 没有检测到问题的问题,我问是否有任何关于如何避免未来类似情况的建议,即 valgrind 没有检测到的内存问题,这是我的一个最喜欢的工具。显然,更好地了解 STL 的工作原理将是一个好主意。也许我需要在我的编程等中对断言更加自信。