C++ 是否可以创建唯一的\u ptr<&燃气轮机;()初始化失败?

C++ 是否可以创建唯一的\u ptr<&燃气轮机;()初始化失败?,c++,c++11,smart-pointers,exception-safe,C++,C++11,Smart Pointers,Exception Safe,从的文档中,我不清楚初始化指针时会发生什么 当分配std::shared_ptr()时,它会分配一个内存缓冲区来处理引用计数器。因此,我可能会得到一个std::bad_alloc异常 初始化唯一指针时会发生类似的情况吗 我问这个问题是因为如果它这样做了,我实际上可能会丢失我试图通过唯一指针删除的内容。例如: void deleter(FILE * f) { fclose(f); } void func() { ... FILE * f(fopen("/tmp/random", O_

从的文档中,我不清楚初始化指针时会发生什么

当分配
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\u ptr
的构造函数都是
noexcept
。所以不,它不可能失败。如果您的
Deleter
类型抛出copy/move,那么
noexcept
将捕获它并调用
std::terminate
所有
unique\u ptr
的构造函数都是
noexcept
。所以不,它不可能失败。如果你的
Deleter
类型抛出了copy/move,那么
noexcept
将捕获它并调用
std::terminate
std::unique\u ptr
根据你链接的文档,ctor是
noexcept
。@BadZen,我想我必须学会正确阅读文档了。我希望在顶部的声明中看到。是的,格式有点粗糙=/<根据您链接的文档,code>std\:unique\u ptrctor是
noexcept
。@BadZen,我想我必须学会正确阅读文档。我希望在顶部的声明中看到。是的,格式有点粗糙=/
  ...
  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;
  ...