unique_ptr<>() 初始化会失败吗?
Can a unique_ptr<>() initialization fail?
根据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<>()
,因为我不只是分配内存。
在 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;
...
还是会出现类似的问题?
unique_ptr
的所有构造函数都是noexcept
。所以不,它不可能失败。如果您的 Deleter
类型在 copy/move 上抛出,那么 noexcept
将捕获它并调用 std::terminate
.
根据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<>()
,因为我不只是分配内存。
在 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;
...
还是会出现类似的问题?
unique_ptr
的所有构造函数都是noexcept
。所以不,它不可能失败。如果您的 Deleter
类型在 copy/move 上抛出,那么 noexcept
将捕获它并调用 std::terminate
.