【问题标题】:Can a unique_ptr<>() initialization fail?unique_ptr<>() 初始化会失败吗?
【发布时间】:2016-11-06 05:47:29
【问题描述】:

std::unique_ptr<>()的文档看,初始化指针时可能发生的事情我不清楚。

在分配std::shared_ptr&lt;&gt;() 时,它会分配一个内存缓冲区来处理引用计数器。所以我可能会得到一个std::bad_alloc 异常。

初始化唯一指针时会发生类似的情况吗?

我问这个问题是因为如果确实如此,我实际上可能会丢失我试图通过唯一指针删除的内容。例如:

void deleter(FILE * f)
{
  fclose(f);
}

void func()
{
  ...
  FILE * f(fopen("/tmp/random", O_CREAT | ...));
  if(f == nullptr) ...handle error...
  std::unique_ptr<FILE, decltype(&deleter)> raii_file(f, deleter);
  ...
}

所以,如果unique_ptr&lt;&gt;() 的初始化可以抛出,我可能最终会保持文件f 永远打开。 (我以FILE * 为例,任何类似的资源都可能受到影响。)

this answer相反,我显然不能使用std::make_unique&lt;&gt;(),因为我不只是分配内存。

fopen() 之前初始化std::unique_ptr&lt;&gt;(),然后将值保存在其中会更安全吗?

  ...
  std::unique_ptr<FILE, decltype(&deleter)> raii_file(nullptr, deleter);
  FILE * f(fopen("/tmp/random", O_CREAT | ...));
  if(f == nullptr) ...handle error...
  raii_file = f;
  ...

还是会有类似的问题?

【问题讨论】:

  • std_::unique_ptr ctor 是 noexcept,根据您链接的文档。
  • @BadZen,我想我必须学会正确阅读文档。我期待在顶部的声明中看到这一点。
  • 是的,格式有点粗糙... =/

标签: c++ c++11 smart-pointers exception-safe


【解决方案1】:

unique_ptr 的所有构造函数都是noexcept。所以不,它不可能失败。如果您的 Deleter 类型在复制/移动时抛出,那么 noexcept 将捕获它并调用 std::terminate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2012-11-17
    • 2017-12-10
    • 2018-09-17
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多