malloc失败的条件

时间:2012-05-02 19:23:03

标签: c++ c memory memory-management memory-leaks

当我运行这个片段时,我正在刷c,重做一些旧的练习并得到一些不寻常的结果(我知道它的泄漏,但想知道系统允许多少......)

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    void *page = 0; int index;
    index = 0;
    while(1)
    {
        page = malloc(1073741824); //1GB
        if(!page)break;
        ++index;
    }
    printf("memory failed at %d\n",index);
    return 0;
}

我实际上得到了:

  

内存在131070失败

这表明它认为它分配了131070 x 1GB内存(慷慨泄漏)

我之前已经理解malloc在使用所有虚拟内存之前应该会失败,当然如果我尝试在一个块中使用malloc 20GB,那么它就失败了。

我的设置: ubuntu 10 8Gb ram, &lt; = 2Gb swap, HD 1TB(这有关系吗?)

任何人都知道如何泄漏更多的内存

1 个答案:

答案 0 :(得分:4)

  • http://www.win.tue.nl/~aeb/linux/lk/lk-9.html

      

    从2.1.27开始,有一个sysctl VM_OVERCOMMIT_MEMORY和proc文件   / proc / sys / vm / overcommit_memory,值为1:do overcommit,和0   (默认):不要。不幸的是,这不允许你告诉   内核要更加小心,它只允许你告诉内核   不太小心。将overcommit_memory设置为1,每个malloc()都会   成功。当设置为0时,使用旧的启发式算法,内核仍然存在   overcommits。

  •   
  您可能还希望查看使用mallinfo的工具:

最后一个链接:

  

在某种程度上,Linux以航空公司销售飞机的方式分配内存   门票。航空公司将售出的票数超过实际票数   座位,希望有些乘客不会出现。记忆   在Linux中以类似的方式管理,但实际上更多   严重程度。