2015-06-30 61 views
-1

我写了一些代码到calloc内存,直到没有更多的可用。MS Windows和Linux之间的Calloc差异?

#include <stdlib.h> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    int *p; 
    int count = 0; 
    while(1) 
    { 
     int inc=1024*1024*sizeof(char); 
     p=(int*) calloc(1,inc); 
     count++; 
     if(!p) 
     { 
      cout << "managed to allocate " << (count * 1024 * 1024)/1000000000.0 << " gb\n"; 
      return 1; 
     } 
    } 
} 

在Visual Studio执行在Windows上面的代码中,我得到如下:

managed to allocate 1.9881 gb 
Press any key to continue . . . 

然而,当我把它给我的Linux系统,并编译和以下运行:

g++ mem.cpp 
./a.out 

这个进程在os后被os所杀死。

看起来即使分配的内存不存在,calloc也不会返回null?

如果是这样的话,那么我如何修改我现有的代码以在Linux上实现与Windows相同的效果?

+1

为什么你用coC++调用calloc()而不是使用标准库的[动态内存管理](http://en.cppreference.com/w/cpp/memory)特性? –

+1

在C++中,我会推荐使用'new'而不是'calloc',然后尝试处理['bad_alloc'](http://en.cppreference.com/w/cpp/memory/new/bad_alloc) – CoryKramer

+0

@CoryKramer否,不要“新”。请参阅我一直在链接的内容。 –

回答

1

发生这种情况是因为Linux“overcommits”memory。 Linux上的进程可以分配比物理可用更多的内存。物理内存仅在实际使用内存时分配。

当Linux耗尽可用物理内存时,它将开始查杀进程,直到内存被释放。

你可以用宽禁用此行为系统:

sudo sysctl -w vm.overcommit_memory=2 

这将确保所有分配的物理内存居然有。这可能不是一个好主意。许多程序依赖于此行为并分配大量从未使用过的内存。

消耗所有可用内存也不是一个好主意。你的程序可能不是分配内存失败的程序或OOM杀手所杀的那个程序。您正在影响系统中的所有进程。

+0

试过这个。现在**我输入的每个**命令都是 “-bash:fork:无法分配内存” – user3002649

+0

您已收到警告。您的系统可能已经分配了比实际可用的更多的内存,并且不会再分配。 –

+0

是的,Linux内存处理是非常糟糕的。这对他们来说是一个鸡与鸡的问题:他们的非标准行为是对严重实施的程序(要求更多内存比他们需要)的反应,现在程序考虑到这个不好的解决方案。所以它是由向后兼容的愿望所固定的。这也是Linux需要像LXC那样攻击的原因之一:内核本身无法正确屏蔽来自不同用户的进程。你可以杀死别人的进程。 – MSalters

相关问题