在 Ubuntu 上用 C++ 出现内存泄漏,本质上和操作系统关系不大,主要是C++ 语言特性和编程习惯导致的。下面从原因、常见场景、Ubuntu 特有的注意点、排查方法四方面说明。
C++ 是手动管理内存的语言:
int* p = new int[10];
// 如果忘了 delete[] p; 就泄漏了
new → deletenew[] → delete[]void f() {
int* p = new int;
throw 1; // 泄漏
delete p;
}
int* p = new int;
p = new int; // 第一个泄漏
std::vector<int*> v;
v.push_back(new int);
std::shared_ptr<A> a, b;
a->b = b;
b->a = a;
dlopen / dlclose 不平衡static 对象分配内存未释放pid_t pid = fork();
wait()char* p = strdup("hello");
// 忘了 free(p)
std::unique_ptr<int> p(new int);
std::shared_ptr<int> q = std::make_shared<int>();
std::vector<int> v(10);
class File {
FILE* f;
public:
File(const char* name) { f = fopen(name, "r"); }
~File() { if (f) fclose(f); }
};
sudo apt install valgrind
valgrind --leak-check=full ./your_program
g++ -fsanitize=address -g main.cpp
./a.out
top
htop
cat /proc/<pid>/status | grep VmRSS
Ubuntu 上的 C++ 内存泄漏,不是系统问题,而是“你申请了内存,却没还”。
如果你愿意,可以把代码片段或报错信息发出来,我可以帮你精确定位是哪一行泄漏的。