You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

new/delete操作后内存占用未恢复,是否属于内存泄漏?

这大概率不是内存泄漏,是内存分配器的正常行为!

嘿,先别着急怀疑自己的代码出了泄漏问题——你看到的任务管理器内存变化,其实是C++内存分配器和操作系统内存管理机制共同作用的结果,我来给你拆解清楚:

  • 任务管理器的内存数值不能直接判定泄漏
    任务管理器显示的是进程整体占用的内存(包括虚拟内存、物理内存),它不会区分「程序正在使用的堆内存」和「分配器已经回收但暂未还给操作系统的内存池」。当你调用delete时,内存只是被归还给了C++的内存分配器(比如Windows上的HeapAlloc/HeapFree,或者glibc的ptmalloc),而不是立刻还给操作系统。分配器会保留这部分内存作为内存池,方便下次分配时直接使用,避免频繁向OS申请内存的开销。

  • 算笔账验证一下
    你创建了1024×1024=1,048,576个结构体,new后内存从0.3MB涨到175MB,相当于每个结构体大概占166字节((175-0.3)10241024 / 1e6 ≈ 166)。delete后剩下的15MB,就是分配器保留的内存池大小,完全在合理范围内。

  • 怎么确认是不是真的泄漏?
    别靠任务管理器猜,用专业工具检测才靠谱:

    • 如果是用MSVC编译,在程序退出前调用_CrtDumpMemoryLeaks(),它会在控制台输出未释放的内存块信息;
    • Linux下可以用Valgrind的memcheck工具,它能精准追踪每一次内存分配和释放;
    • 你也可以做个循环测试:多次重复「new所有结构体→delete所有结构体」的操作,如果每次循环后内存都稳定在15MB左右,那绝对是正常的;如果内存持续上涨,那才是真的泄漏。

简单说:分配器不会把回收的内存立刻还给OS,任务管理器看到的「剩余内存」其实是分配器留着备用的内存池,不是泄漏的内存。

内容的提问来源于stack exchange,提问作者r.kr

火山引擎 最新活动