1

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 *以此为例,任何类似的资源都可能受到影响。)

这个答案相反,我显然不能使用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;
  ...

还是会有类似的问题?

4

1 回答 1

5

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

于 2016-11-06T05:53:16.553 回答