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