从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;
...
还是会有类似的问题?