在 Ubuntu 上用 C++ 检测内存泄漏,常用且成熟的方法有下面几种,从最推荐到进阶依次说明。
sudo apt update
sudo apt install valgrind
-g)g++ -g -O0 main.cpp -o main
valgrind --leak-check=full ./main
definitely lost:确定内存泄漏(重点关注)indirectly lost:间接泄漏still reachable:程序结束但没释放(通常问题不大)✅ 优点:
❌ 缺点:
g++ -fsanitize=address -g -O1 main.cpp -o main
./main
如果有泄漏,程序结束时会直接打印:
ERROR: LeakSanitizer: detected memory leaks
✅ 优点:
❌ 缺点:
#include <cstdlib>
#include <iostream>
int alloc_count = 0;
void* operator new(size_t size) {
alloc_count++;
return malloc(size);
}
void operator delete(void* p) noexcept {
alloc_count--;
free(p);
}
int main() {
int* p = new int[10];
// delete[] p; // 故意不释放
std::cout << "alloc count: " << alloc_count << std::endl;
}
#include <mcheck.h>
int main() {
mtrace();
int* p = new int[10];
// 忘记 delete
return 0;
}
g++ main.cpp -o main
export MALLOC_TRACE=log.txt
./main
mtrace main log.txt
| 场景 | 推荐 |
|---|---|
| 日常调试 | AddressSanitizer |
| 深度分析 | Valgrind |
| CI / 测试 | ASan |
| 极简环境 | Valgrind |
Valgrind → 不用改代码,慢
ASan → 快,需重编译(首选)
mtrace → 老,不推荐
手动new → 学习用
如果你愿意,可以:
我可以帮你选最合适的方案并给你完整示例。