1. 确认内存泄漏存在
首先需要通过系统工具观察进程内存使用趋势,判断是否真的存在泄漏。常用命令包括:
top/htop:实时查看进程的内存占用(RES列,即常驻内存),若进程的内存使用持续上升且不回落,可能存在泄漏;free -m:查看系统整体内存使用情况(used内存是否持续增加),辅助判断是否因某个进程导致系统内存紧张。2. 使用内存泄漏检测工具定位问题
Valgrind是Linux下最经典的内存调试工具,能精准检测内存泄漏位置及类型(如未释放的malloc内存、重复释放等)。
sudo apt install valgrind;-g选项(保留调试信息),然后执行valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./your_program;ASan是更现代的内存错误检测工具,速度快于Valgrind,支持检测内存泄漏、越界访问、使用未初始化内存等问题。
-fsanitize=address -g选项(-g保留调试信息),例如gcc -fsanitize=address -g -o my_program my_program.c;malloc/free的调用轨迹,适合简单的内存泄漏场景。编译时添加-g,程序中插入mtrace()和muntrace(),运行后生成日志文件,用mtrace命令分析;brk、mmap),通过查看内存分配/释放的系统调用,辅助判断是否存在未释放的内存。3. 分析泄漏原因并修复代码
根据工具报告,常见的内存泄漏原因包括:
malloc/calloc分配的内存未对应free,new分配的对象未对应delete;std::shared_ptr的循环引用会导致引用计数无法归零,需改用std::weak_ptr打破循环;try-catch块中未处理free);4. 验证修复效果
修复代码后,需重新运行检测工具(如Valgrind或ASan),确认报告中无新的内存泄漏。例如,再次执行valgrind --leak-check=full ./your_program,若输出显示“No leaks are possible”,则说明泄漏已修复。
5. 监控与预防
top/htop定期检查进程内存使用,设置阈值告警(如内存使用超过80%时触发通知);