在 Ubuntu(Linux)下用 C++ 管理内存,本质上和在其他 Linux/Unix 系统上是一样的,但 Ubuntu 提供了一些工具链和机制可以帮助你更好地管理、调试和优化内存。下面从基础 → 进阶 → 工具三个层面讲。
void foo() {
int a = 10; // 栈上分配,函数结束自动释放
}
int* p = new int(10);
delete p;
数组:
int* arr = new int[100];
delete[] arr;
⚠️ 常见问题:
delete → 内存泄漏delete → 未定义行为#include <memory>
std::unique_ptr<int> p = std::make_unique<int>(10);
std::shared_ptr<int> q = std::make_shared<int>(20);
✅ 优点:
std::vector<int> v(100); // 自动管理
✅ 99% 情况不需要 new/delete
Ubuntu 默认使用 glibc malloc
malloc_trim#include <malloc.h>
malloc_trim(0); // 释放空闲内存给系统
#include <sys/mman.h>
void* p = mmap(nullptr, size, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
munmap(p, size);
✅ 适合:
Ubuntu 可限制进程内存:
ulimit -v 500000 # 限制虚拟内存 500MB
sudo apt install valgrind
valgrind ./your_program
检查:
g++ -fsanitize=address -g main.cpp
./a.out
✅ 比 Valgrind 快,推荐开发期使用
export ASAN_OPTIONS=detect_leaks=1
pmap -x <pid>
htop
查看进程内存使用
| 问题 | 解决 |
|---|---|
| 内存泄漏 | 智能指针 / Valgrind |
| 段错误 | AddressSanitizer |
| 内存暴涨 | 容器容量控制 / mmap |
| 多线程内存问题 | shared_ptr + 锁 |
✅ 默认使用:
std::vectorstd::stringstd::unique_ptr❌ 避免:
new/delete如果你愿意,我可以:
你现在是做哪类项目?