无限分配内存应用程序崩溃

时间:2015-05-26 15:01:00

标签: c++ windows memory allocation

我有一个代码

#include <iostream>

using namespace std;

int main()
{
    while(true)
    {
        try
        {
            new int;
        }
        catch(std::exception e)
        {

        }
    }
    return 0;
}

因此,当我在Linux下运行此代码时,我的计算机会在内存结束时冻结(正如预期的那样),但是当我在Windows上时,我的应用程序在分配3 GB内存后崩溃(通常我有1 gb)使用,总共16个)。为什么会崩溃?如何防止这种情况?

当我用new int替换malloc(1)时,在分配这3 GB后,内存不会分配更多

2 个答案:

答案 0 :(得分:1)

我的猜测是它在Windows下崩溃只是你把它编译为x86而不是x64可执行文件。 x86可执行文件具有3GB RAM的限制,因为它耗尽了地址。在Linux下你默认编译64位(在使用g ++的64位机器上),所以它不会在这里崩溃但冻结系统,因为系统在RAM外输出后使用交换空间是非常慢的。如果SWAP也填满,您的系统就会崩溃。将Windows版本编译为64位,然后看看会发生什么。

我对此文本的假设是你有一台64位机器(否则你将无法使用这些16GB的RAM)。

现在,当使用malloc而不是new时,您的程序不会崩溃,因为malloc有错误状态。它只会给你一个NULL指针,因为它无法分配更多的内存。 new没有。

答案 1 :(得分:0)

为什么你希望程序会冻结?这只是一种可能的行为,不是最好的而不是最坏的(最诚实的是最糟糕的)。 C ++标准有很多具有未定义行为的地方。这显然是这个地方之一,因为它取决于底层的OS层。

尝试在catch块中打印一些内容。因此,您将知道应用程序崩溃的时间 - 捕获异常之前或之后。分配更大的块,因为现在在完全缺乏内存的情况下,C ++运行时可能无法正常工作并且可能导致崩溃。