为何添加std::cout后,循环new int的内存占用不再激增?
问题:打印指针地址为何影响内存占用?
我原本想测试内存耗尽时操作系统的行为,写了这段代码:
int main() { int *p; while(1) { p = new int; } }
但添加打印p的地址的代码后,意外发现内存占用不再激增,反而保持恒定,而且每次循环里p的地址和前一次完全相同:
#include <iostream> int main() { int *p; while(1) { p = new int; std::cout << &p << std::endl; } }
想搞懂std::cout << &p << std::endl;是怎么影响内存占用的?
原因拆解
首先纠正一个关键误解:你打印的&p是指针变量p自身在栈上的地址,不是new分配出来的堆内存地址。p是main函数的局部变量,栈位置从程序启动就固定了,所以每次循环打印的都是同一个值——这和内存分配行为完全无关,要是想查看new分配的堆地址,应该写std::cout << p << std::endl;。
再来说内存占用变化的核心原因:
- 无打印版本:循环没有任何阻塞,CPU全速执行
new操作,内存分配速度极快(每秒能分配几百万个int),操作系统的物理内存和虚拟内存被快速占满,所以内存占用肉眼可见地飙升。 - 有打印版本:每次循环都要执行控制台输出,这是个速度极慢的操作——输出一行文本需要等待系统调用、屏幕刷新,速度比内存分配慢好几个数量级。循环的执行节奏被IO彻底拖慢,每秒只能完成几十次
new,内存增长速度慢到系统监控工具(比如任务管理器)根本捕捉不到变化,看起来就像是保持恒定。
另外还有个辅助因素:当内存占用到一定程度时,操作系统的内存回收机制(比如把闲置内存页交换到swap分区)会启动,而IO带来的延迟正好给了操作系统足够的时间回收内存,进一步限制了进程的内存增长。
内容的提问来源于stack exchange,提问作者kush_1244
相关产品推荐
相关产品推荐

