裸指针易崩溃因手动管理生命周期,易致double free或use-after-free;unique_ptr通过raii确保每次分配后自动释放,避免人为错误,使压力测试更可靠。

为什么直接用指针做内存压力测试容易崩溃
因为裸指针本身不管理生命周期,new 和 delete 完全手动,稍有疏漏(比如重复释放、提前释放、忘记释放)就会触发 double free 或 use-after-free,导致进程被 SIGABRT 终止——这根本不是“压力测出来”的结果,而是代码错误暴露的假阳性。
用 std::unique_ptr 模拟持续分配/释放更可靠
真正的压力测试关注的是系统级内存行为(如 malloc 碎片、页表增长、OOM Killer 触发),而不是制造随机崩溃。用 RAII 智能指针可确保每次循环都干净释放,把变量控制权交还给系统:
for (size_t i = 0; i (block_size);
// 可选:强制访问每页以防止 lazy allocation
for (size_t j = 0; j
-
block_size建议从 4KB 起步,逐步翻倍(如 4K→8K→16K…),观察/proc/meminfo中PageTables和Committed_AS变化 - 避免在循环内调用
std::cout或printf——I/O 会掩盖真实内存延迟,且锁竞争干扰测量 - 若需长时间运行,建议每 1000 次迭代
usleep(1)防止单核 100% 占用影响系统其他进程
绕过堆管理器直触系统分配(仅限 Linux)
想测 mmap(MAP_ANONYMOUS) 的原始性能?可以不用 new,改用 mmap + munmap ,但必须注意:
-
mmap最小单位是页(通常 4KB),申请小于一页也会占满一页 - 必须检查返回值是否为
MAP_FAILED,否则后续写入会触发SIGSEGV - 频繁
mmap/munmap比malloc/free开销大得多,适合测内核内存子系统,不适合模拟应用常态
示例关键片段:
void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (addr == MAP_FAILED) {
perror("mmap failed");
return;
}
// 使用后立即 munmap(addr, size);
监控比分配更重要:别只看程序有没有 crash
真正有效的内存压力测试,90% 工作量在观测端。重点盯住这些信号:
-
/proc/[pid]/status中的VmRSS(实际物理内存)和VmSize(虚拟地址空间)是否线性增长 -
dmesg -T | tail是否出现Out of memory: Kill process—— 这才是压力起效的标志 - 用
perf stat -e 'syscalls:sys_enter_mmap,syscalls:sys_enter_munmap'看系统调用频次,判断是否卡在内核路径
裸指针本身不提供任何可观测性,而 std::unique_ptr 或 mmap 配合 /proc 和 perf 才构成闭环。别让调试器里的 Segmentation fault 假象,掩盖了你其实没压到系统瓶颈的事实。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











