[英]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
類型引發復制/移動,則noexcept
將捕獲它並調用std::terminate
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.