内存泄露示例代码:
//leak_example.cpp
#include <iostream>
int main() {
int* ptr = new int(42);
// 没有释放内存
// delete ptr;
return 0;
}
1、安装Valgrind
sudo apt-get install valgrind
2.编译代码
使用g++编译代码,并加上-g选项以包含调试信息,这样 Valgrind 能给出更详细的报告:
g++ -g -o leak_example leak_example.cpp
4. 使用 Valgrind 检测内存泄漏
valgrind --leak-check=full --show-leak-kinds=all ./leak_example
--leak-check=full:
开启全面的内存泄漏检测,会详细报告所有可能的内存泄漏情况。
--show-leak-kinds=all
:显示所有类型的内存泄漏,包括definitely lost(确定丢失)
、indirectly lost(间接丢失)
、possibly lost(可能丢失)
和still reachable(仍可访问)
。
5. 分析 Valgrind 的输出结果
关键信息是 by 0x40069A: main (leak_example.cpp:5),它明确指出内存泄漏发生在 leak_example.cpp 文件的第 5 行。
HEAP SUMMARY
:总结了程序运行期间的堆内存使用情况,包括退出时仍在使用的内存、分配和释放的次数等。
definitely lost
:表示确定存在内存泄漏,即程序中动态分配的内存没有被释放。在上述示例中,4 bytes in 1 blocks are definitely lost
表明有 4 字节的内存没有被释放。
indirectly lost
:间接丢失的内存,通常是由于指向该内存的指针所在的内存块丢失导致的。
possibly lost
:可能存在内存泄漏,Valgrind 不能确定这些内存是否真的丢失。
still reachable
:程序结束时仍可访问的内存,通常是全局变量或静态变量指向的内存,一般不认为是内存泄漏。