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左右,那绝对是正常的;如果内存持续上涨,那才是真的泄漏。
- 如果是用MSVC编译,在程序退出前调用
简单说:分配器不会把回收的内存立刻还给OS,任务管理器看到的「剩余内存」其实是分配器留着备用的内存池,不是泄漏的内存。
内容的提问来源于stack exchange,提问作者r.kr




