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