2016-03-26 15 views
1

unique_ptr逆参照への参照を返すシングルトンパターンを使用します。ここで私はクラスのデストラクタは一度だけ呼び出すだろうが、デストラクタが呼ばれる理由はここに、二回と呼ばれるデストラクタ一度と呼ばれるコンストラクタは、出力は、static unique_ptrがデストラクタを2回呼び出す

main starts! 
Lazy::Lazy() 0xb1ec20 
auto state = Settings::lazy() 0x7ffe17ae18b8 
main ends! 
Lazy::~Lazy() 0x7ffe17ae18b8 
Lazy::~Lazy() 0xb1ec20 

ですが、ことを期待していたコード、

#include <iostream> 
#include <memory> 
using std::cout; using std::endl; 
using std::unique_ptr; 

namespace Settings { 
    class Lazy { 
     Lazy() { cout << "Lazy::Lazy() " << this << endl; } 
    public: 
     ~Lazy() { cout << "Lazy::~Lazy() " << this << endl; } 
     static Lazy &instance() 
     { 
      static unique_ptr<Lazy> lazy(new Lazy); 
      return *lazy; 
     } 
    }; 

    Lazy &lazy() 
    { return Lazy::instance(); } 
} 

int main() 
{ 
    cout << "main starts!" << endl; 
    auto state = Settings::lazy(); 
    cout << "auto state = Settings::lazy() " << &state << endl; 

    cout << "main ends!" << endl; 
    return 0; 
} 

です二度?そして、2番目の呼び出しでさえ、このアドレスは異なります。

+2

'オート状態=設定::怠惰();'あなたが内部の任意のトレース出力を持たない自動コピーコンストラクタを呼び出します。シングルトンが本当に必要な場合はプライベートなものを作成すると、エラーが表示されます。 –

+0

なぜ 'unique_ptr'を使うのですか?静的なオブジェクトを持っているだけかもしれません。 – Galik

+1

私はこの答えを見てみることをお勧めします:http://stackoverflow.com/a/1008289/3807729 – Galik

答えて

4

シングルトンのインスタンスが2つあり、両方が破棄されるためです。

シングルトンを2つ持つ必要があるのは、シングルトンを取得するとコピーが作成されるからです。auto state = Settings::lazy();参照を返す可能性がありますが、stateは参照ではないため、コピーが作成されます。 state参照が問題を修正作る

auto& state = Settings::lazy();

関連する問題