C malloc和免费

Ami*_*old -2 c malloc free memory-management

我被教导如果你做malloc(),但你没有free(),内存将一直保持到重新启动.好吧,我当然测试了它.一个非常简单的代码:

#include <stdlib.h>

int main(void)
{
    while (1) malloc(1000);
}
Run Code Online (Sandbox Code Playgroud)

我在任务管理器(Windows 8.1)中查看了它.

嗯,该程序真的很快就占用了2037.4 MB而且就这样.我知道它可能是Windows限制程序.

但这是奇怪的部分:当我关闭控制台时,内存使用百分比下降,即使我被教导它不应该!

免费呼叫是多余的,因为操作系统无论如何都要释放它?

(这里的问题是相关的,但不能完全回答我是否应该自由.)

fuz*_*fuz 5

在Windows上,32位进程只能分配2048兆字节,因为那里有多少个地址.有些内存可能会被W​​indows逆转,因此总数较低.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 calls\n", counter);
            return 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

$ ./mem
malloc failed after 3921373 calls
Run Code Online (Sandbox Code Playgroud)

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

你为什么需要free()呢?嗯,这只发生在程序终止时,并不区分你仍然需要的内存和你不再需要的内存.当你的进程正在做复杂的事情时,它经常不断地为自己的计算分配和释放内存.明确释放内存非常重要,free()否则您的进程可能在某些时候不再能够分配新内存和崩溃.如果可以的话,释放内存也是一种很好的编程习惯,这样你的进程就不会不必要地占用大量的内存.相反,其他进程可以使用该内存.