1.C/C++ 内存治理神器 - Google Sanitizers

Santizers是由Google开发的开源工具,集成在LLVM项目中,来检查内存泄漏和其他内存错误。Sanitize工具是一组用于检测内存错误的工具,包括地址、内存泄漏、使用未初始化的内存、使用已释放的内存等。总共包括如下子项目:

AddressSanitizer(ASan):有来作堆、栈、全局变量越界分析;多次动态内存释放或无效释放
LeakSanitizer(LSan):内存泄漏分析
ThreadSanitizer(TSan):线程分析
UndefinedBehaviorSanitizer(UBSsan):无定义行为分析
MemorySanitizer(MSan):内存分析

在这里,我们将使用AddressSanitizer和UndefinedBehaviorSanitizer。

首先,我们需要在编译时启用Sanitize工具。在CMakeLists.txt文件中,我们需要添加以下代码:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=undefined")

然后,我们需要重新编译代码。在编译完成后,我们可以使用以下命令运行代码:

./path/to/your/program

如果程序中存在内存错误,Sanitize工具将会输出错误信息。我们可以根据错误信息来修复代码中的错误。
-fsanitize=leak是GCC和Clang提供的一种内存泄漏检测工具,它可以检测出程序中的内存泄漏问题。在使用这个工具时,可以使用以下参数:

-fsanitize=leak:启用内存泄漏检测工具。

-fsanitize=leak-trace-objects:在检测到内存泄漏时,输出泄漏对象的详细信息。

-fsanitize=leak-check:在程序退出时,检查是否有内存泄漏。

-fsanitize=leak-check-full:在程序退出时,检查是否有内存泄漏,并输出泄漏对象的详细信息。

-fsanitize=leak-check-strict:在程序退出时,检查是否有内存泄漏,并输出泄漏对象的详细信息。如果有内存泄漏,程序会直接退出。

-fsanitize=leak-check-strict-keep-files:在程序退出时,检查是否有内存泄漏,并输出泄漏对象的详细信息。如果有内存泄漏,程序会直接退出。同时,会将泄漏对象的信息保存到文件中。

-fsanitize=leak-check-strict-keep-frames:在程序退出时,检查是否有内存泄漏,并输出泄漏对象的详细信息。如果有内存泄漏,程序会直接退出。同时,会将泄漏对象的信息保存到文件中,并且保存泄漏对象的调用栈信息。

-fsanitize=leak-check-strict-keep-frames-and-objects:在程序退出时,检查是否有内存泄漏,并输出泄漏对象的详细信息。如果有内存泄漏,程序会直接退出。同时,会将泄漏对象的信息保存到文件中,并且保存泄漏对象的调用栈信息和对象信息。

valgrind

Valgrind是一个用于检测内存泄漏和其他内存错误的工具。要在CMakeLists.txt文件中使用Valgrind,我们需要添加以下代码:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g")

然后,我们需要重新编译代码。在编译完成后,我们可以使用以下命令运行代码:

valgrind --leak-check=full ./path/to/your/program

如果程序中存在内存错误,Valgrind将会输出错误信息。我们可以根据错误信息来修复代码中的错误。