在 Ubuntu(Linux)下用 C++ 管理内存,核心原则和在其他 Linux 平台是一致的,但因为 Ubuntu 常用的工具链(gcc/g++、clang)和调试工具(valgrind、sanitizer),有一些实用方法和工具值得重点掌握。
下面从基础原则 → 常用方式 → Ubuntu 特有工具 → 常见错误系统讲一下。
void foo() {
int a = 10;
} // a 自动释放
int* p = new int(10);
delete p;
常见错误:
new 但忘记 deletenew[] 用 deletedeleteUbuntu 上 g++ 完全支持 C++11/14/17/20。
std::unique_ptr(独占所有权)#include <memory>
auto p = std::make_unique<int>(10);
std::shared_ptr(共享所有权)auto p = std::make_shared<int>(10);
✅ 好处:
delete#include <vector>
std::vector<int> v(100);
new int[100] 安全得多所有资源(内存、文件、锁)都用对象管理
class File {
FILE* f;
public:
File(const char* name) { f = fopen(name, "r"); }
~File() { if (f) fclose(f); }
};
sudo apt install valgrind
valgrind ./your_program
检测:
g++ -fsanitize=address -g main.cpp -o main
./main
优点:
ASAN_OPTIONS=detect_leaks=1 ./main
gdb ./main
run
bt
Ubuntu 默认使用 glibc malloc:
malloc / freeMALLOC_CHECK_export MALLOC_CHECK_=3
mmap 或直接用 STLulimit -aulimit -a
new/delete 跨线程shared_ptr + mutex| 问题 | 原因 | 解决 |
|---|---|---|
| 内存泄漏 | 忘记 delete | 智能指针 |
| 段错误 | 野指针 | ASan + gdb |
| 双重释放 | 多次 delete | unique_ptr |
| 越界 | 数组写错 | vector + sanitizer |
✅ 不要:
new/delete✅ 要:
如果你愿意,我可以:
你现在是学习阶段还是在 debug 实际问题?