C 除非初始化,否则不使用分配的内存?

C 除非初始化,否则不使用分配的内存?,c,C,这是我刚才问的问题的后续部分 我创建了一个简单的程序来帮助自己理解内存分配,malloc()和free()。注意注释掉的free行。我故意造成内存泄漏,这样我就可以看到Windows报告的“内存使用量”慢慢膨胀到1GB。但后来我发现了一些奇怪的东西。如果我注释掉空闲行上方的循环,这样我就不会用随机整数初始化存储块,那么看起来这个空间实际上并没有被程序从操作系统“声明”。为什么会这样 当然,我没有在块中初始化它,但我已经声明了它,所以操作系统不应该仍然看到程序正在使用1GB,不管是否初始化了GB

这是我刚才问的问题的后续部分

我创建了一个简单的程序来帮助自己理解内存分配,
malloc()
free()
。注意注释掉的
free
行。我故意造成内存泄漏,这样我就可以看到Windows报告的“内存使用量”慢慢膨胀到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();
    }
}
#包括
#包括
无效alloc_one_meg(){
int*pmeg=(int*)malloc(250000*sizeof(int));
int*p=pmeg;
int i;

//对于(i=0;i分配的内存在Windows中可以处于两种状态:保留和提交(请参阅关于
MEM_RESERVE
“保留一系列进程的虚拟地址空间,而不在内存或磁盘上的分页文件中分配任何实际物理存储。”

如果您分配内存但不使用它,它将保持保留状态,操作系统不会将其视为已用内存。当您尝试使用它时(无论是在写入时,还是在读取和写入时,我不知道,您可能希望进行测试以找出原因),它将变为已提交内存,操作系统会将其视为已用内存


另外,由
malloc
分配的内存不会满0(实际上可能正好满,但不保证满),因为您尚未初始化它。

分配的内存在Windows中可以处于两种状态:保留和提交(请参阅关于
MEM\u RESERVE
的文档):
“保留进程的一系列虚拟地址空间,而不在内存或磁盘上的分页文件中分配任何实际物理存储。”

如果您分配内存但不使用它,它将保持保留状态,操作系统不会将其视为已用内存。当您尝试使用它时(无论是在写入时,还是在读取和写入时,我不知道,您可能希望进行测试以找出原因),它将变为已提交内存,操作系统会将其视为已用内存


另外,
malloc
分配的内存将不会充满0(实际上可能是,但不能保证),因为您没有初始化它。

可能是编译器优化:内存根本没有使用,因此可能的优化是不根据编译器和优化选项分配此内存


我测试了你的代码,行:
free((void*)pmeg);
不会对我造成任何内存泄漏。

可能是编译器优化:内存根本没有被使用,因此一种可能的优化是不根据编译器和优化选项分配内存



我测试了你的代码,行:
free((void*)pmeg);
不会对我造成任何内存泄漏。

注意:内存不会是“一堆零”…实际上malloc()的内存是随机的/未初始化的。calloc()将初始化为零。感谢Oli和kfm,我删除了这一行。我还有很多东西要学习,但这肯定是一个假设,我现在看到一个错误的假设。主要问题仍然是::-)@kfmfe04:根据C标准,
malloc
返回的内存有一个不确定的值,它在C99有一个相当具体的定义。@DietrichEpp我想这个定义与随机/未初始化的定义有不同的含义?我想知道它是什么(总是需要新的知识!)-你能详细说明一下吗““不确定值”实际上是指?注意:内存不会是“一堆零”…实际上malloc()ed内存是随机的/未初始化的。calloc()将初始化为零。感谢Oli和kfm,我删除了这一行。我仍然有很多东西要学习,但这肯定是一个假设,我现在看到一个错误的假设。主要问题仍然存在:“-@kfmfe04:根据C标准,
malloc
返回的内存有一个不确定的值,它与C有一个相当具体的定义99.@DietrichEpp我想这个定义与随机/未初始化的定义有不同的含义?我很想知道它是什么(总是需要新知识!)-你能详细说明什么是“不确定值”吗“实际上是指?
实际上可能是,但不能保证,而且通常不是……至少在我的经验中是这样。@Steve对于大型分配,“通常”是这样的。请看这个问题:@Mystical-Cool-有意义(安全性)-我想我最习惯于更多的时间分配…谢谢你的链接。我很感激。
事实上可能是这样,但不一定是这样。
而且大多数情况下不是这样。@Steve对于大型分配,“通常”是这样。请看这个问题:@Mystical-Cool-有意义(安全性)-我想我最习惯于更多的时间分配…谢谢你的链接。我很感激。@Dietrich Epp:你错了:不分配从未使用过的内存是编译器可能进行的优化之一。这是一个重要的优化。那么编译器如何知道“malloc”是分配内存的函数呢?就C语言而言“malloc”可以是任何函数。堆不是由编译器管理的,而是(通常)由OS和libc管理。编译器无法优化它,因为这不是它的工作。@tangrs:编译器知道malloc是分配的…事实上,编译器有一个分配优化!!!对于许多语言。编译器可以做的唯一优化是静态分配。编译器如何知道“malloc”是r分配?我无法链接libc并编译一个“malloc”不起任何作用的程序。编译器无法优化dynami