除非初始化,否则未使用内存分配?

时间:2011-12-23 01:41:38

标签: c

这是我刚才提出的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();
    }
}

2 个答案:

答案 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);不会导致任何内存泄漏。