从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;
...
还是会有类似的问题?
所有unique_ptr
的构造函数都是noexcept
。因此,没有,它不可能失败。如果您的Deleter
类型引发复制/移动,则noexcept
将会捕获并调用std::terminate
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句