在 Linux 下用 C++ 管理内存,核心仍然是 C++ 语言本身的内存管理机制 + Linux 系统提供的内存相关接口/工具。下面从 基础 → 进阶 → 实战工具 系统讲一下。
void foo() {
int a = 10; // 栈上分配
} // 自动释放
ulimit -s 查看)int* p = new int(10);
delete p;
int* arr = new int[100];
delete[] arr;
⚠️ 常见问题:
delete → 内存泄漏delete → 未定义行为new/delete 不匹配(new[]/delete)C++11 以后强烈建议使用
std::unique_ptr#include <memory>
std::unique_ptr<int> p = std::make_unique<int>(10);
std::shared_ptrstd::shared_ptr<int> p = std::make_shared<int>(10);
✅ 优点:
std::vector<int> v;
v.push_back(1);
new/delete+------------------+
| 栈 (stack) |
+------------------+
| 堆 (heap) |
+------------------+
| BSS |
| 数据段 |
| 代码段 |
+------------------+
malloc/new → 从堆分配brk / mmap 向内核申请内存#include <cstdlib>
void* p = malloc(100);
free(p);
new 底层也调用 mallocptmalloc 管理空闲内存#include <sys/mman.h>
void* p = mmap(nullptr, size, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
munmap(p, size);
适用场景:
valgrind --leak-check=full ./a.out
检测:
g++ -fsanitize=address -g main.cpp
./a.out
✅ 比 Valgrind 快,推荐开发期使用
cat /proc/<pid>/status
关注:
VmRSS(物理内存)VmSize(虚拟内存)free -h
top
htop
std::vector / stringnewstd::movenew/delete#include <memory>
#include <vector>
void test() {
auto p = std::make_unique<int>(42);
std::vector<int> v(1000);
}
// 全部自动释放
我可以进一步讲:
你可以告诉我你是 学习 / 面试 / 写服务器 / 写嵌入式 哪种场景。