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番目の呼び出しでさえ、このアドレスは異なります。
'オート状態=設定::怠惰();'あなたが内部の任意のトレース出力を持たない自動コピーコンストラクタを呼び出します。シングルトンが本当に必要な場合はプライベートなものを作成すると、エラーが表示されます。 –
なぜ 'unique_ptr'を使うのですか?静的なオブジェクトを持っているだけかもしれません。 – Galik
私はこの答えを見てみることをお勧めします:http://stackoverflow.com/a/1008289/3807729 – Galik