0

运行我的项目时,我得到了一个 free: invalid 指针。但是当我尝试使用 -fsanitize=address 寻找根本原因时,错误消失了。当我移除消毒剂时,错误再次出现。谁能给出一些关于发生了什么以及如何在这种情况下查明问题的提示?谢谢!

更新:

我知道没有代码很难给出建议。由于项目非常大,而且我仍在尝试构建一个最小的工作示例,因此我现在无法提供任何代码。所以我想把我的问题改成一个更笼统的问题:

根据我对地址清理器的理解,它应该跟踪所有分配/访问操作,如果有任何无效访问,则报告错误。因此,如果不应用地址清理程序时出现错误,则应用清理程序后错误应该仍然存在。这种理解正确吗?

4

1 回答 1

1

既然你问了一个模糊和不具体的问题,我将提供一个陈词滥调和不具体的答案......

尽量不要自己直接分配和取消分配

阅读这个 SO 问题及其答案:

为什么 C++ 程序员应该尽量减少“新”的使用?

如果您使用容器(std::vector,std::array等)或智能指针(std::unique_ptr, std::shared_ptr) - 那么分配和取消分配将为您处理。您不会重复分配这些资源。在许多应用中完全避免new和完全可行实际上是完全可行的。delete

点你的 i 并交叉你的 t - 带有编译器警告

许多问题实际上是由编译器检测到的,但在技术上并不是无效的 C++,因此它允许它们通过并且只给你一个警告。

努力解决所有编译器警告,并启用更多警告进行编译。例如,对于 g++,至少使用-W -Wall -Wextra,还有更多。

越界写?

您可能会错误地写入越界或通过过时的指针。这可能会导致您尝试释放的指针被覆盖。要尝试检测这一点,运行您的程序valgrind可能会很有用。看:

valgrind 是如何工作的?

另一种方法是使用另一种消毒剂 - 记忆消毒剂 (Msan)。阅读这些和 valgrind 之间的区别,以决定哪个对你有用:

内存/地址消毒剂与 Valgrind

于 2020-06-09T22:46:06.710 回答