c - 在循环中使用 malloc 如何进行内存分配 >

标签 c malloc dynamic-memory-allocation

在这种情况下,内存分配是如何进行的? 我观察到这与直接在 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/

相关文章:

c# - 修改传递给C dll的char数组c#

c - 嵌入式系统中的 malloc

c - 当我使用 free() 时,c 中的程序遇到无限循环

c - 为什么在 C11 中没有对齐的 calloc

c - 如何确定两个相似函数的效率更高

c - C语言判断字符串是否为空

c - fscanf 不读取第一个单词的第一个字符(在 c 中)

c - 使用结构指针和数组编写以下函数的代码

c - 如何在不知道数据类型的情况下写入 void 指针?

c++ - 正确删除 3D 矩阵的指针