【问题标题】:Infinite allocation memory app crashes无限分配内存应用程序崩溃
【发布时间】:2015-08-08 08:14:59
【问题描述】:

我有密码

#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 后,内存不会分配更多

【问题讨论】:

  • “崩溃”是怎么回事?你到底想做什么?
  • 你的catch 没用。在抛出 bad_alloc 异常后,您不能调用 new,并且在该上下文中不可能发生其他异常。
  • 此外,编译器可能会看到您实际上并未存储 new 返回值并优化调用。
  • 异常也应该被 const 引用 not 按值捕获。
  • 看你的代码我什至不明白你打算做什么?

标签: c++ windows memory allocation


【解决方案1】:

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

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

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

【讨论】:

  • 是的,当我使用 g++ 64bit 时,它起作用了!请说我,当我的Linux死机的时候只有80%的内存被占用了? WINDOWS不会发生这种情况
【解决方案2】:

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

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

【讨论】:

  • 这更有可能导致竞争条件。首先会发生什么?输出还是冻结?也许输出也可能导致此时冻结。
猜你喜欢
  • 2015-10-16
  • 1970-01-01
  • 2010-11-14
  • 2023-03-07
  • 1970-01-01
  • 2016-10-09
  • 2012-07-01
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多