C++ MS Windows和Linux之间的Calloc差异?
我为calloc内存编写了一些代码,直到没有更多可用的内存C++ MS Windows和Linux之间的Calloc差异?,c++,linux,calloc,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);
#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;
}
}
}
但是,当我将它带到我的Linux系统中并使用以下命令编译和运行时:
managed to allocate 1.9881 gb
Press any key to continue . . .
g++ mem.cpp
./a.out
该进程在一段时间后被操作系统终止
即使分配的内存不存在,calloc也不会返回null
如果是这样的话,那么我如何修改现有代码以在Linux上实现与在Windows上相同的效果呢?这种情况的发生是因为Linux“过度使用”了内存。Linux上的进程可以分配比物理可用内存更多的内存。只有在实际使用内存时才分配物理内存 当Linux耗尽可用的物理内存时,它开始终止进程,直到释放内存 您可以通过以下方式在系统范围内禁用此行为:
sudo sysctl -w vm.overcommit_memory=2
它将确保所有分配的物理内存实际上都在那里。这可能不是个好主意。许多程序依赖于这种行为并分配大量从未使用过的内存
消耗所有可用内存也不是一个好主意。您的程序可能不是无法分配内存或被OOM killer杀死的程序。你正在影响系统中的所有进程。为什么你使用C++而不是使用C++来使用<代码> CalOrthe()/Cube,而不是使用标准库的特性?在C++中,我建议使用<代码>新< /COD>而不是<代码> CaloLc<代码>,然后尝试处理@ CykkRAMER No,而不是<代码>新< /C> >。请参考我链接的内容。在Linux上搜索“Overmit”,这可能是进程被终止的原因。@πάνταῥεῖ 同意,但老实说,我仍然不确定OP希望从他们的代码中找到什么。可用内存?当然,有更好的方法来做到这一点,而不仅仅是分配直到它死去。现在我输入的每个命令都会告诉您“-bash:fork:cannotallocate memory”。您的系统可能已经分配了比实际可用内存更多的内存,并且不会分配更多。是的,Linux内存处理是出了名的糟糕。对他们来说,这是一个鸡和蛋的问题:他们的非标准行为是对执行糟糕的程序(要求的内存比他们需要的要多)的反应,现在程序考虑到了这个糟糕的解决方案。因此,它是由向后兼容的愿望固定的。这也是Linux需要像LXC这样的黑客攻击的原因之一:内核本身无法正确屏蔽不同用户的进程。你可以在这个过程中杀了别人。