max*_*use 2 c memory malloc memory-leaks memory-management
我正在尝试使用malloc进行实验,以查看是否可以分配所有可用内存。
我使用了以下简单程序,并有几个问题:
int main(void)
{
char * ptr;
int x = 100;
while(1)
{
ptr = (char *) malloc(x++ * sizeof(char) / 2);
printf("%p\n",ptr);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
1)为什么当使用较大的数据类型(int,unsigned long long int,long double)时,该进程将使用较少的内存,而使用较小的数据类型(int,char)将使用更多的内存?
2)运行程序时,它会在达到一定数量后停止分配内存(在Windows 7 64位系统上约为592mb,并将8GB RAM交换文件设置为系统托管)。如果输出为0,则表示NULL。为什么在达到此阈值后停止分配内存,而没有耗尽系统内存并进行交换?
我在以下文章中发现有人尝试与我做相同的事情,但是区别是他们没有看到内存使用方面的任何区别,但是我同意。 使用malloc的内存泄漏失败
我已经在Linux内核2.6.32-5-686上尝试过该代码,但结果相似。
任何帮助和解释将不胜感激。
谢谢,
1)通常,内存是在多个页面中分配的,因此,如果您要求的大小小于一个页面,则malloc将分配至少一个页面。
2)这是有道理的,因为在多任务系统中,您不是唯一的用户,并且您的进程不是唯一正在运行的进程,还有许多其他进程共享有限的资源集,包括内存。如果操作系统允许一个进程无限制地分配其所需的所有内存,那么它并不是一个好的操作系统,对吗?
最后,在Linux中,内核直到您真正开始使用该内存后才分配任何物理内存页面,因此仅调用malloc并不会实际消耗任何物理内存,除了跟踪自己的分配本身所需的内容之外课程。我不确定Windows。
编辑:下面的示例分配1GB的虚拟内存
#include <stdio.h>
int main(int agrc, char **argv)
{
void *p = malloc(1024*1024*1024);
getc(stdin);
}
Run Code Online (Sandbox Code Playgroud)
如果你跑得最好,你会得到
Run Code Online (Sandbox Code Playgroud)top -p `pgrep test` PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20 0 1027m 328 252 S 0 0.0 0:00.00 test
如果将malloc更改为calloc,然后再次运行top,则得到
Run Code Online (Sandbox Code Playgroud)top -p `pgrep test` PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20 0 1027m 1.0g 328 S 0 1.3 0:00.08 test
归档时间: |
|
查看次数: |
4747 次 |
最近记录: |