这4K的区别是什么?

时间:2013-10-17 13:04:14

标签: c memory heap memory-leaks

我为一个简单的测试编写了一个简单的代码。

#include <stdio.h>

typedef struct
{
    void* Data;
}List;

void x()
{
    getchar();

    int i;
    List* myList[100000];

    for(i = 0; i < 100000; i++)
    {
        myList[i] = (List*)malloc(sizeof(List)*1024*1024);
    }

    getchar();

    for(i = 0; i < 100000; i++)
    {
        free(myList[i]);
    }
}

int main()
{
    x();
    getchar();
    return 0;
}

我看过“taskmgr”中的程序,我看过: - 540K - 4.500K - 544K(什么是4K差异?)

2 个答案:

答案 0 :(得分:7)

如果您的所有分配都成功,您将使用大约100000 * 1024 * 1024 * sizeof (List)个字节,这是(假设List是4个字节,32位指针)略高于 390 GB

由于您引用的数字要低得多,因此可以安全地假设并非所有分配都实际成功。实际上,很难想象它们都会在32位系统上取得成功......无论如何,你的代码永远都不会检查它,所以很难分辨。

课程:malloc()可能会失败,如果您不检查返回值,则无法假定分配已成功。

另外,don't cast the return value of malloc() in C

答案 1 :(得分:1)

现代操作系统倾向于过度使用资源,并且只有在您使用资源时才会实际执行分配。这是针对使用分页和页面错误的内存完成的。由于您从未通过malloc()读取或写入您请求的内存,因此操作系统很可能从未映射过任何页面。

尝试将写入每个分配的缓冲区。读取可能还不够,因为可以映射系统或进程范围的零页面,并依靠写入时复制(COW)来执行实际分配。通常就是这种情况。

即便如此,如果为每个缓冲区分配的页面长度超过了页面长度,则可能需要执行每页 来实际获取所有页面。

这样做,看着你的过程变得更加肥胖。