应用地址清理器后,免费的无效指针消失了

free invalid pointer disappeared after applying address sanitizer

我在 运行 我的项目中得到了一个 free: invalid pointer。但是,当我尝试使用 -fsanitize=address 查找根本原因时,错误消失了。当我取出消毒剂时,错误再次出现。任何人都可以暗示发生了什么以及如何在这种情况下查明问题吗?谢谢!

更新:

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

根据我对address sanitizer的理解,它应该跟踪所有allocation/access操作,如果有任何无效访问就报告错误。因此,如果在不应用地址消毒剂时出现错误,那么在应用消毒剂后错误应该仍然存在。这个理解对吗?

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

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

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

Why should C++ programmers minimize use of 'new'?

如果您使用容器(std::vectorstd::array 等)或智能指针(std::unique_ptrstd::shared_ptr)——那么分配和取消分配将是为你照顾。您不会重复分配这些资源。在很多应用中完全避免 newdelete 实际上是非常可行的。

在 i 上画点并在 t 上画十字 - 带有编译器警告

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

努力解决所有编译器警告,并且 - 在启用更多警告的情况下进行编译。比如用g++,至少要用-W -Wall -Wextra,还有更多的还是

越界写入?

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

How does valgrind work?

另一种方法是使用另一种消毒剂——内存消毒剂 (Msan)。了解它们与 valgrind 之间的区别,以确定哪个适合您: