Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MS Windows和Linux之间的Calloc差异?_C++_Linux_Calloc - Fatal编程技术网

C++ MS Windows和Linux之间的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);

我为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;
        }
    }
}
但是,当我将它带到我的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这样的黑客攻击的原因之一:内核本身无法正确屏蔽不同用户的进程。你可以在这个过程中杀了别人。