std::unique_ptr<>()のドキュメントから、ポインタの初期化がわかりにくいときに何が起こる可能性があります。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<>()
を使用することができない
対向。
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;
...
これに似た問題がありますか?
'std _ :: unique_ptr' ctorは、あなたがリンクしているドキュメントの通り、' noexcept'です。 – BadZen
@BadZen、私はドキュメントを正しく読むことを学ばなければならないと思う。私は一番上の宣言でそれを見ることを期待していました。 –
ええ、書式設定はちょっとラフです... = / – BadZen