c++ - MS Windows 和 Linux 之间的 Calloc 差异?

标签 c++ 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也不会返回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/

相关文章:

c++ - 为什么在分配有 'new' 的指针上调用 free() 会导致堆损坏?

c++ - 为什么某些 IDE 不缩进 switch 中的 case 语句?

c++ - 意外的非空返回

regex - 如何让 grep 输出所有匹配的行?

Calloc() 不分配零

c - 正确使用 realloc()

c++ - 浮点问题

linux - bash 脚本删除一些字符

linux - 从bash脚本启动Shrewsoft

c - 关于 C 中 calloc 和 free 函数的问题