温馨提示×

ubuntu c++为什么内存泄漏

小樊
44
2026-10-08 07:18:31
栏目: 编程语言

在 Ubuntu 上用 C++ 出现内存泄漏,本质上和操作系统关系不大,主要是C++ 语言特性和编程习惯导致的。下面从原因、常见场景、Ubuntu 特有的注意点、排查方法四方面说明。


一、为什么 C++ 容易内存泄漏(通用原因)

C++ 是手动管理内存的语言:

int* p = new int[10];
// 如果忘了 delete[] p; 就泄漏了

常见泄漏原因

  1. new / delete 不配对
    • new → delete
    • new[] → delete[]
  2. 异常导致 delete 没执行
    void f() {
        int* p = new int;
        throw 1;   // 泄漏
        delete p;
    }
    
  3. 指针被覆盖
    int* p = new int;
    p = new int; // 第一个泄漏
    
  4. 容器里存裸指针
    std::vector<int*> v;
    v.push_back(new int);
    
  5. 循环引用(智能指针误用)
    std::shared_ptr<A> a, b;
    a->b = b;
    b->a = a;
    

二、Ubuntu / Linux 下特别容易踩的坑

1. 后台服务长期运行

  • 守护进程(daemon)
  • 服务器程序
    → 小泄漏也会累积成 OOM

2. 动态库(.so)问题

  • dlopen / dlclose 不平衡
  • 库内部 static 对象分配内存未释放

3. fork + 内存

pid_t pid = fork();
  • 子进程没正确退出
  • 父进程没 wait()

4. 使用 C 库函数

char* p = strdup("hello");
// 忘了 free(p)

三、Ubuntu 下推荐的避免方式

✅ 优先用智能指针

std::unique_ptr<int> p(new int);
std::shared_ptr<int> q = std::make_shared<int>();

✅ 用 STL 容器代替裸数组

std::vector<int> v(10);

✅ RAII(资源获取即初始化)

class File {
    FILE* f;
public:
    File(const char* name) { f = fopen(name, "r"); }
    ~File() { if (f) fclose(f); }
};

四、Ubuntu 下如何检测内存泄漏

1. Valgrind(最常用)

sudo apt install valgrind
valgrind --leak-check=full ./your_program

2. AddressSanitizer(推荐,快)

g++ -fsanitize=address -g main.cpp
./a.out

3. 查看进程内存

top
htop
cat /proc/<pid>/status | grep VmRSS

五、一句话总结

Ubuntu 上的 C++ 内存泄漏,不是系统问题,而是“你申请了内存,却没还”。

如果你愿意,可以把代码片段或报错信息发出来,我可以帮你精确定位是哪一行泄漏的。

0 踩