我编写了一些代码来调用内存,直到没有更多可用的内存为止。
#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也不会返回null?
如果是这样的话,那么如何修改现有的代码才能在Linux上达到与Windows上相同的效果?
最佳答案
发生这种情况是因为 Linux“过度使用”内存。 Linux 上的进程可以分配比物理可用内存更多的内存。物理内存只有在实际使用内存时才会分配。
当 Linux 耗尽可用物理内存时,它会开始终止进程,直到内存被释放。
您可以通过以下方式在系统范围内禁用此行为:
sudo sysctl -w vm.overcommit_memory=2
它将确保所有分配的物理内存实际上都在那里。这可能不是一个好主意。许多程序依赖于这种行为并分配大量从未使用过的内存。
消耗所有可用内存也不是一个好主意。你的程序可能不是分配内存失败的程序,也可能不是被 OOM Killer 杀死的程序。您正在影响系统中的所有进程。
关于c++ - MS Windows 和 Linux 之间的 Calloc 差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31147032/