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;
}
}
}

Выполняя приведенный выше код в Windows в Visual Studio, я получаю следующее:

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

Тем не менее, когда я перенесу его в свою систему Linux, скомпилирую и запусту следующее:

g++ mem.cpp
./a.out

Процесс убит ОС через некоторое время.

Кажется, что calloc не вернет ноль, даже если выделенная память не существует?

Если это так, то как я могу изменить свой существующий код для достижения того же эффекта в Linux, что и в Windows?

-1

Решение

Это происходит потому, что Linux «перегружает» память. Процессы в Linux могут выделять больше памяти, чем физически доступно. Физическая память выделяется только тогда, когда память фактически используется.

Когда у Linux заканчивается физическая память, он начинает убивать процессы, пока память не будет освобождена.

Вы можете отключить это поведение всей системы с помощью:

sudo sysctl -w vm.overcommit_memory=2

Это позволит убедиться, что вся выделенная физическая память на самом деле там. Это не может быть хорошей идеей. Многие программы полагаются на это поведение и выделяют много никогда не используемой памяти.

Также не стоит использовать всю доступную память. Ваша программа может быть не той, которая не выделяет память, или той, которая убита OOM killer. Вы влияете на все процессы в вашей системе.

1

Другие решения