gpt4 book ai didi

visual-studio - Valgrind 或 Electric Fence 未检测到堆损坏。我应该怀疑吗? (C++)

转载 作者:行者123 更新时间:2023-12-04 15:03:51 24 4
gpt4 key购买 nike

我最近遇到了我的第一个 battle (已解决)与堆损坏。在我家里的 linux 机器上,罪魁祸首代码使用 valgrind 和电栅栏(使用 gdb)无误地退出。然而,在我们实验室的 Windows 机器上,我始终收到来自 VS 的与堆损坏相关的错误消息,在我引用的帖子中有所描述。

valgrind 和电围栏不会检测到这样的问题是否令人惊讶(或至少不常见)?其他人在回答 here 中提到了一个可能与 valgrind 相似的错误。 .这些工具无法检测到此问题的原因可能是什么?是否有任何理由怀疑错误实际上是堆损坏?

更新 :正如在描述原始问题的帖子中提到的,我发现问题是由于指向 std::vector 中的元素的指针而导致的,这变得很糟糕。用 std::list 替换向量(添加新元素时指针不会变为无效)修复了问题。所以回到我关于为什么 valgrind 没有检测到问题的问题,我问是否有任何关于如何避免将来发生类似情况的建议,即 valgrind 未检测到的内存问题,这是我的问题之一最喜欢的工具。显然,更好地了解 STL 的工作原理将是一个好主意。也许我需要在我的编程等中对断言更加自信。

最佳答案

因此,Valgrind 未能检测到您的堆损坏的明显原因是 GCC STL 实现根本没有发生损坏(即没有检测到错误)。

不幸的是,Valgrind 的运行级别远低于 STL,因此许多错误仍未被发现。例如:

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

幸运的是,GCC STL 有一种特殊的 Debug模式,旨在捕获许多此类问题。尝试使用 -D_GLIBCXX_DEBUG 构建您的原始代码.它可能会捕获原始问题,并且可能会捕获更多您尚不了解的问题。

关于visual-studio - Valgrind 或 Electric Fence 未检测到堆损坏。我应该怀疑吗? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com