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 *
例として使用します。同様のリソースが影響を受ける可能性があります。)
this answerとは反対に、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;
...
それとも、同様の問題がありますか?