C malloc和免费

我被告知,如果你做malloc(),但你没有释放(),那么内存将保持被占用,直到重新启动。 那么,我当然会测试它。 一个非常简单的代码:

#include <stdlib.h>

int main(void)
{
    while (1) malloc(1000);
}

我在任务管理器(Windows 8.1)中观看了它。

那么,该计划真的很快就占用了2037.4 MB,并且保持这种状态。 我知道这可能是Windows限制程序。

但是这里有个奇怪的部分:当我关闭控制台时,尽管我被教导说它不应该这样,但内存使用率却下降了。

打电话免费是多余的,因为操作系统无论如何都可以解放它?

(这里的问题是相关的,但不能完全回答我是否应该免费)。


在Windows上,32位进程只能分配2048兆字节,因为那是多少个地址。 有些内存可能被Windows颠倒过来,因此总体数字较低。 malloc在失败时返回一个空指针,这可能是在那个时候发生的。 你可以像这样修改你的程序来看看:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    int counter = 0;
    while (1) {
        counter++;
        if (malloc(1000) == NULL) {
            printf("malloc failed after %d callsn", counter);
            return 0;
        }
    }
}

现在你应该得到这样的输出:

$ ./mem
malloc failed after 3921373 calls

当进程终止或者从外部终止时(就像通过任务管理器来终止进程一样),进程分配的所有内存都会被释放。 操作系统管理哪些内存属于哪个进程,因此可以在进程终止时释放内存。 然而,操作系统并不知道每个进程如何使用它从操作系统请求的内存,并且取决于告诉它何时不再需要内存块的进程。

为什么你需要free()呢? 那么,这只发生在程序终止时,并且不会区分你仍然需要的内存和不再需要的内存。 当你的过程做了复杂的事情时,它经常不断地为自己的计算分配和释放内存。 使用free()显式释放内存很重要,否则你的进程可能在某个时候不再能够分配新的内存和崩溃。 在可以的时候释放内存也是很好的编程习惯,所以你的过程不会不必要地消耗大量内存。 相反,其他进程可以使用该内存。


建议您在完成分配的内存后调用free ,因为您稍后可能需要此内存空间,如果没有用于新分配的内存空间,则会出现问题。 你应该总是寻求你的代码的可移植性。如果Windows释放这个空间,可能是其他操作系统不这样做。


操作系统中的每个进程都有一定数量的可寻址内存,称为进程地址空间。 如果分配了大量的内存,并且最终分配了可用于此进程的所有内存,malloc将失败并返回NULL。 而且你将无法再为这个过程分配内存。

链接地址: http://www.djcxy.com/p/80405.html

上一篇: C malloc and free

下一篇: Understanding malloc and pointer incrementation with free