在 Linux 下用 C++ 做内存管理,通常可以从语言层面、系统层面、工具层面三个角度来看。下面系统地给你梳理一下。
C++ 中主要有以下几种内存区域:
| 区域 | 说明 |
|---|---|
| 栈(stack) | 局部变量,自动分配/释放,速度快 |
| 堆(heap) | new / malloc,手动管理 |
| 全局/静态区 | 全局变量、static 变量 |
| 常量区 | 字符串常量等 |
int* p = new int(10);
delete p;
int* arr = new int[10];
delete[] arr;
⚠️ 注意:
new ↔ deletenew[] ↔ delete[]malloc/free 和 new/delete现代 C++(C++11 起)强烈推荐使用智能指针:
#include <memory>
std::unique_ptr<int> p1 = std::make_unique<int>(10);
std::shared_ptr<int> p2 = std::make_shared<int>(20);
优点:
-----------------
栈 (stack)
↓
↓
↑
堆 (heap)
-----------------
BSS
数据段
代码段
C++ 的 new 最终调用:
mallocmalloc → brk / mmap查看内存使用:
cat /proc/<pid>/maps
cat /proc/<pid>/status
ulimit -a
ulimit -v 100000 # 限制虚拟内存
int* p = new int(10);
// 忘了 delete
检测工具:
valgrindvalgrind ./a.out
int* p = new int;
delete p;
*p = 10; // 错误
✅ 建议:
delete p;
p = nullptr;
new/delete 小对象void* operator new(size_t size) {
return malloc(size);
}
void operator delete(void* p) {
free(p);
}
常用库:
tcmallocjemalloc✅ 日常开发:
std::vector / stringsmart pointernew✅ 性能/底层开发:
brk/mmapvalgrind / sanitizer✅ 调试:
g++ -fsanitize=address -g main.cpp
如果你愿意,我可以:
你更想深入哪一块?