在这种情况下,内存分配是如何进行的? 我观察到这与直接在 1000000*10000 上使用 malloc 不同,后者应该导致分配 4*10GB(每个 int 4 个字节)。然而,这段代码在执行时只使用了 200MB。
for(int i=0;i<1000000;i++)
{
int *A = (int*)malloc(sizeof(int)*10000);
}
最佳答案
如前所述,内存是按 block 分配还是单独分配是有区别的。您看不到正在分配的内存的主要原因是操作系统在内存方面存在问题。
如果您分配一 block 内存,则分配是虚拟的。由于所有进程都有大量可用的虚拟内存,它通常会成功(除非您要求疯狂的内存量,或者操作系统以其他方式确定它不会工作)。物理内存的实际保留可能发生在您实际使用内存之后。
所以当您查看内存使用情况时,不仅有一个数字,还有多个。有共享内存,有不能调出的内存,有虚拟分配的内存,还有实际使用的内存。
如果您更改代码以实际使用内存,例如只向分配的部分写入一个字节,您将看到完全不同的结果。操作系统必须处理内存分配并获取物理内存中的内存块。
另外如前所述,您不检查 malloc
是否成功。也许它成功了几次,然后就不再分配任何东西了。
这个系统还解释了为什么有时一个进程可能会因为内存不足而被杀死,即使所有进程的所有分配都成功了。操作系统过于乐观,认为它可以提供比实际更多的内存。
关于c - 在循环中使用 malloc 如何进行内存分配 >,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251269/