应用地址清理器后,免费的无效指针消失了
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::vector
、std::array
等)或智能指针(std::unique_ptr
、std::shared_ptr
)——那么分配和取消分配将是为你照顾。您不会重复分配这些资源。在很多应用中完全避免 new
和 delete
实际上是非常可行的。
在 i 上画点并在 t 上画十字 - 带有编译器警告
编译器实际上 检测到 许多问题,但在技术上并不是无效的 C++,所以它让它们通过并且只给你一个警告。
努力解决所有编译器警告,并且 - 在启用更多警告的情况下进行编译。比如用g++,至少要用-W -Wall -Wextra
,还有更多的还是
越界写入?
您可能错误地越界或通过过时的指针写入。这可能会导致您试图释放的指针被覆盖。要尝试检测这一点,运行 您的带有 valgrind
的程序可能会有用。参见:
How does valgrind work?
另一种方法是使用另一种消毒剂——内存消毒剂 (Msan)。了解它们与 valgrind 之间的区别,以确定哪个适合您:
我在 运行 我的项目中得到了一个 free: invalid pointer。但是,当我尝试使用 -fsanitize=address 查找根本原因时,错误消失了。当我取出消毒剂时,错误再次出现。任何人都可以暗示发生了什么以及如何在这种情况下查明问题吗?谢谢!
更新:
我明白没有代码很难给出建议。由于该项目非常大,而且我仍在尝试构建一个最小的工作示例,因此我现在无法提供任何代码。所以我想将我的问题更改为更笼统的问题:
根据我对address sanitizer的理解,它应该跟踪所有allocation/access操作,如果有任何无效访问就报告错误。因此,如果在不应用地址消毒剂时出现错误,那么在应用消毒剂后错误应该仍然存在。这个理解对吗?
既然你问了一个模糊和不具体的问题,我会提供一个陈词滥调和不具体的答案...
尽量不要自己直接分配和取消分配
阅读这个 SO 问题及其答案:
Why should C++ programmers minimize use of 'new'?
如果您使用容器(std::vector
、std::array
等)或智能指针(std::unique_ptr
、std::shared_ptr
)——那么分配和取消分配将是为你照顾。您不会重复分配这些资源。在很多应用中完全避免 new
和 delete
实际上是非常可行的。
在 i 上画点并在 t 上画十字 - 带有编译器警告
编译器实际上 检测到 许多问题,但在技术上并不是无效的 C++,所以它让它们通过并且只给你一个警告。
努力解决所有编译器警告,并且 - 在启用更多警告的情况下进行编译。比如用g++,至少要用-W -Wall -Wextra
,还有更多的还是
越界写入?
您可能错误地越界或通过过时的指针写入。这可能会导致您试图释放的指针被覆盖。要尝试检测这一点,运行 您的带有 valgrind
的程序可能会有用。参见:
How does valgrind work?
另一种方法是使用另一种消毒剂——内存消毒剂 (Msan)。了解它们与 valgrind 之间的区别,以确定哪个适合您: