You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:25:53