在 Linux 下用 C++ 配置/管理内存,通常可以从 使用方式 和 系统级配置 两个层面来理解。下面按常见场景给你一个清晰、实用的总结。
int a = 10; // 栈
static int b = 20; // 静态存储区
特点:
int* p = new int(10);
delete p;
或数组:
int* arr = new int[100];
delete[] arr;
✅ 需要手动释放
❌ 容易内存泄漏、重复释放
#include <memory>
std::unique_ptr<int> p1 = std::make_unique<int>(10);
std::shared_ptr<int> p2 = std::make_shared<int>(20);
✅ 自动释放
✅ 防止内存泄漏
✅ 工业级写法
alignas(64) int data[100];
或:
#include <cstdlib>
void* p = aligned_alloc(64, 1024);
free(p);
常用于:
void* operator new(std::size_t size) {
return std::malloc(size);
}
用于:
free -h
cat /proc/meminfo
ulimitulimit -a
ulimit -v 524288 # 虚拟内存 512MB
ulimit -m 262144 # 物理内存 256MB
⚠️ 只对当前 shell 有效
mkdir /sys/fs/cgroup/memory/test
echo 500M > /sys/fs/cgroup/memory/test/memory.limit_in_bytes
echo $$ > /sys/fs/cgroup/memory/test/cgroup.procs
适合:
export MALLOC_ARENA_MAX=2
防止:
cat /proc/meminfo | grep Huge
启用:
echo 128 > /proc/sys/vm/nr_hugepages
用于:
valgrind --leak-check=full ./a.out
heaptrack ./a.out
gdb ./a.out
g++ -fsanitize=address -g main.cpp
./a.out
可检测:
❌ malloc / new 后不释放
❌ 栈上分配超大数组
❌ 多线程下频繁 new/delete
❌ 盲目调系统参数而不分析
你可以告诉我:
我可以直接给你一份 可落地的配置方案和示例代码。