簡體   English   中英

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類型引發復制/移動,則noexcept將捕獲它並調用std::terminate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM