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

亚历克西斯·威尔克(Alexis Wilke)

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

还是会有类似的问题?

尼科尔·波拉斯(Nicol Bolas)

所有unique_ptr的构造函数都是noexcept因此,没有,它不可能失败。如果您的Deleter类型引发复制/移动,则noexcept将会捕获并调用std::terminate

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章