2013-04-18 37 views
10

Meyerのシングルトンをすべてのグローバルポインタ変数に使用することを同僚は「グローバルなunique_ptrの構築がスローされない保証はありません」と主張しています。だから、代わりに:グローバルstd :: unique_ptrをシングルトンで置き換える場合

#include <memory> 

std::unique_ptr<Foo> ptr(nullptr); // Apparently this isn't safe. 

int main(/*blah*/) 
{ 
    ptr.reset(new Foo()); 
} 

我々は今、私に

unique_ptr<Foo> singleton 
{ 
    try 
    { 
     static unique_ptr<Foo> ptr(); 
     return ptr; 
    } 
    catch (...) 
    { 
     std::cerr << "Failed to create single instance\n"; 
     exit(1); 
    } 
    return unique_ptr<Type>(); 
} 

int main() 
{ 
} 

を持ってこれが問題を探している解決策のように思えます。彼にはポイントがありますか?

+1

また、例外をキャッチして終了すると、失敗した理由を突き止めるチャンスを捨ててしまうと、私はより悪い考えのように思えます。ほとんどのシステムでは、未処理の例外が終了し、デバッグ出力(コアファイルなど)が生成されます。 –

答えて

21

あなたの同僚は間違っています(またはちょうど古いバージョンのunique_ptrとは異なる場合があります)。 unique_ptrnullptr_tコンストラクタが(20.7.1.2)をスローしないことが保証されています

constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {} 

それもconstexprをだ(とnullptrが定数式であるため)、一定の初期化時に初期化する必要があるので、(3.6.2/2)。したがって、初期化順序の制御(Meyersシングルトンが有用かもしれないもう一つの理由)もここでは適用されません。

+0

すべての 'unique_ptr'要素はnoexceptです。 'constexpr' ctorは、_constant initialization_の間、_static initialization_の一部の間の初期化を許可します。これは、* any * _dynamic initialization_の前に実行されます。 – dyp

+0

@DyP:単に許可する、または必要としますか? –

+1

_default.init]/2 – dyp

2

を「保証はスローされませんグローバルunique_ptrを建設ありません」そして、それをスローした場合に、何が起こりますか?例外をキャッチしないと(グローバル変数として、例外をキャッチする場所はありません)、スタックが解き放たれるかどうかを指定しませんが、アプリケーションは終了します。提案されたソリューションがそれをどのように明確に改善しているかはっきりしていません。

関連する問題