在 Linux 下用 C++ 配置/设置内存,常见场景有几种,不同目的配置方式不一样。下面按「最常见 → 进阶」给你系统梳理一下,你可以对照自己的需求来看。
new / malloc 动态分配内存这是最基础的方式。
int* p = new int[100]; // 分配 100 个 int
delete[] p;
int* p = (int*)malloc(100 * sizeof(int));
free(p);
✅ 适合:普通程序
❌ 不适合:超大内存、实时系统
ulimit 限制内存(临时)ulimit -v 524288 # 虚拟内存限制 512MB(单位 KB)
ulimit -m 262144 # 物理内存限制 256MB
查看当前限制:
ulimit -a
⚠️ 只对当前 shell 生效。
cgroups(推荐,服务器/容器)限制某个进程最多用 500MB 内存:
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
✅ 适合:服务器、Docker、多进程环境
#include <cstdlib>
void* my_alloc(size_t size) {
return std::malloc(size);
}
void my_free(void* p) {
std::free(p);
}
或实现 std::allocator:
template<typename T>
class MyAllocator {
public:
using value_type = T;
T* allocate(size_t n) {
return static_cast<T*>(std::malloc(n * sizeof(T)));
}
void deallocate(T* p, size_t) {
std::free(p);
}
};
✅ 适合:高性能、游戏引擎、数据库
查看默认栈大小:
ulimit -s
临时修改:
ulimit -s 8192 # 8MB
线程中设置栈大小:
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 8 * 1024 * 1024);
⚠️ 栈太大容易导致内存浪费
cat /proc/sys/vm/overcommit_memory
可选值:
0:启发式(默认)1:总是允许2:严格限制临时修改:
sysctl vm.overcommit_memory=2
top
htop
cat /proc/<pid>/status
valgrind ./a.out
| 需求 | 推荐方式 |
|---|---|
| 普通 C++ 程序 | new / malloc |
| 限制程序内存 | ulimit / cgroups |
| 高性能内存管理 | 自定义 allocator |
| 多线程栈 | pthread_attr_setstacksize |
| 服务器 | cgroups + overcommit |
你可以直接告诉我:
我可以直接给你一份 可复制用的配置示例。