MS Windows和Linux之间的Calloc差异?

时间:2015-06-30 19:39:40

标签: c++ linux calloc

我向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 

该过程稍后会被操作系统杀死。

即使分配的内存不存在,似乎calloc也不会返回null?

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

1 个答案:

答案 0 :(得分:1)

这是因为Linux&#34; overcommits&#34;记忆。 Linux上的进程可以分配比实际可用内存更多的内存。仅在实际使用内存时才分配物理内存。

当Linux耗尽可用物理内存时,它会开始终止进程​​,直到内存被释放。

您可以使用以下方法在系统范围内禁用此行为:

sudo sysctl -w vm.overcommit_memory=2

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

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