首页 > 解决方案 > unique_ptr 和内存分配失败

问题描述

我想使用unique_ptr<A>(new A)(not make_unique()) 创建一个唯一指针。

构造unique_ptr函数是noexcept,但是new可能会抛出bad_alloc

unique_ptr<A>(new A)所以我的问题是,如果new失败,我是否应该期待异常调用?

我试图检查一下,我在下面的代码中得到了“中止”,而我希望"null"在屏幕上看到。所以看起来,万一new失败,unique_ptr会抛出异常。

那是对的吗?

class A
{
  public:
  int vec[1000000000];
};

int main()
{
  A* a[100000];
  for (int i = 0; i < 100000; ++i)
  {
    a[i] = unique_ptr<A>(new A).release();
    if (!a[i])
    {
      cout << "null" << endl;
      break;
    }
  }
  return 0;
}

注意:此代码的唯一目标是填充内存,从而导致new失败。

标签: c++

解决方案


unique_ptr<A>(new A)所以我的问题是,如果new失败,我是否应该期待异常调用?

是的。如果new失败,则会抛出std::bad_alloc异常,std::unique_ptr甚至根本不会构造对象。

我试图检查一下,我在下面的代码中得到了“中止”,而我希望"null"在屏幕上看到。所以看起来,万一new失败,unique_ptr会抛出异常。那是对的吗?

new,是抛出异常的人,而不是std::unique_ptr构造函数(正如您所指出的,由于存在,它无论如何都不能noexcept)。由于在构造函数之外new被调用,因此被标记为的构造函数是无关紧要的。noexcept

如果要避免std::bad_alloc抛出异常,请使用 的std::nothrow版本new,例如:

#include <new>

a[i] = unique_ptr<A>(new(nothrow) A).release();

或者,由于您的使用unique_ptr().release()违背了 的全部目的std::unique_ptr,因此完全省略它:

a[i] = new(nothrow) A;

不要忘记delete成功new编辑的任何内容。


推荐阅读