unique_ptr<>()初始化是否会失败?

时间:2016-11-06 05:47:30

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

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

分配std::shared_ptr<>()时,它会分配一个内存缓冲区来处理引用计数器。所以我可能会遇到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<>()的初始化可以抛出,我可能会最终保持文件f永远打开。 (我使用FILE *作为示例,任何类似的资源都可能受到影响。)

反对this answer,我显然无法使用std::make_unique<>(),因为我不只是分配内存。

std::unique_ptr<>()之前初始化fopen()会更安全,然后将值保存在那里吗?

  ...
  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;
  ...

或者那会有类似的问题吗?

1 个答案:

答案 0 :(得分:4)

所有unique_ptr的构造函数都是noexcept。所以不,它不可能失败。如果您的Deleter类型会引发复制/移动,则noexcept会抓住它并致电std::terminate