这是我刚才提出的here问题的后续问题。
我创建了一个简单的程序来帮助自己理解内存分配malloc()
和free()
。注意注释掉的free
行。我创建了一个故意的内存泄漏,所以我可以看到Windows报告“Mem Usage”膨胀到1GB。但后来我发现了一些奇怪的东西。如果我在自由行的正上方注释掉循环,那么我没有用随机整数初始化我的存储块,看起来该空间实际上并没有被程序从操作系统“声明”。这是为什么?
当然,我还没有对它进行初始化,但是我已经声明了,所以操作系统是否应该仍然看到该程序使用1GB,无论该GB是否已初始化?
#include <stdio.h>
#include <stdlib.h>
void alloc_one_meg() {
int *pmeg = (int *) malloc(250000*sizeof(int));
int *p = pmeg;
int i;
// for (i=0; i<250000; i++) /* removing this loop causes memory to not be used? */
// *p++ = rand();
// free((void *)pmeg); /* removing this line causes memory leak! */
}
main()
{
int i;
for (i=0; i<1000; i++) {
alloc_one_meg();
}
}
答案 0 :(得分:7)
Windows中已分配的内存可以处于两种状态:保留和委托(请参阅VirtualAlloc
关于MEM_RESERVE
的文档:"Reserves a range of the process's virtual address space without allocating any actual physical storage in memory or in the paging file on disk."
)。
如果您分配内存但不使用它,它将保持在保留状态,并且操作系统不将其计为已用内存。当你尝试使用它时(无论是在写入时,还是在读写时,我都不知道,你可能想要进行测试才能找到),它会变成Commited内存,并且操作系统将其视为使用
此外,由malloc
分配的内存不将满0(实际上可能是,但不能保证),因为你没有初始化它。
答案 1 :(得分:-1)
它可能是编译器优化:根本不使用内存,因此可能的优化是不根据编译器和优化选项分配此内存。
我测试了你的代码,行:free((void *)pmeg);
不会导致任何内存泄漏。