【发布时间】:2016-11-06 05:47:29
【问题描述】:
从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<>(),因为我不只是分配内存。
在fopen() 之前初始化std::unique_ptr<>(),然后将值保存在其中会更安全吗?
...
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_ptrctor 是noexcept,根据您链接的文档。 -
@BadZen,我想我必须学会正确阅读文档。我期待在顶部的声明中看到这一点。
-
是的,格式有点粗糙... =/
标签: c++ c++11 smart-pointers exception-safe