我写了一个快速而又脏的程序,通过反复调用malloc
来泄漏内存。我注意到当我在Debug配置中运行我的程序时(在VS 2012中),我的程序正确地消耗了千兆字节的内存并一直持续到页面文件已满(Windows任务管理器报告高工作集大小)。但是,当我在发布模式下运行程序时,我的程序的工作集大小仍然很小,但是Commit大小一直在增长。磁盘抖动或页面错误也明显减少。
MSDN文档指出,当处于调试模式时,malloc
被映射到_malloc_dbg
,但是文档还指出两者都在堆上分配内存,只有_malloc_dbg
分配额外的内存调试信息 - 没有提到不同的堆行为(即为什么它不会出现在发布模式下的私有工作集中)。
祈祷告诉,发生了什么事?
答案 0 :(得分:5)
提交虚拟内存页面时,no physical memory is allocated直到访问该页面。
调试malloc用已知模式填充新分配的内存,而释放malloc不初始化它。
初始化会导致调试所需的物理RAM页面(以及更多抖动)比发布时更多。
如果您要实际触摸已分配内存的每一页,我预计两个版本之间的大部分差异都会消失。