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

Infinite allocation memory app crashes

我有密码

#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 GB)。为什么会崩溃?如何预防?

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

我的猜测是它在 Windows 下崩溃只是因为您将其编译为 x86 而不是 x64 可执行文件。 x86 可执行文件有 3GB RAM 的限制,因为它用完了地址。在 Linux 下,您默认编译 64 位(在使用 g++ 的 64 位机器上),因此它不会在这里崩溃但会冻结系统,因为系统在 RAM 不足后使用交换 space该死的慢。如果 SWAP 也被填满,那么你的系统就会崩溃。将 Windows 版本编译为 64 位,然后看看会发生什么。

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

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

为什么您认为该程序会冻结?这只是可能的行为之一,不是最好的也不是最坏的(老实说,很可能是最坏的)。 C++ 标准有很多地方有未定义的行为。这显然是其中之一,因为它依赖于底层OS层。

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