2016-11-06 8 views
0

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; 
    ... 

これに似た問題がありますか?

+1

'std _ :: unique_ptr' ctorは、あなたがリンクしているドキュメントの通り、' noexcept'です。 – BadZen

+0

@BadZen、私はドキュメントを正しく読むことを学ばなければならないと思う。私は一番上の宣言でそれを見ることを期待していました。 –

+0

ええ、書式設定はちょっとラフです... = / – BadZen

答えて

4

unique_ptrのすべてのコンストラクタはnoexceptです。そうではありませんが、失敗する可能性はありません。 Deleterタイプがコピー/移動をスローすると、noexceptはそれを捕まえてstd::terminateに電話します。

関連する問題