私は最近、EECSクラスでこのトピックを取り上げました。講義ノートを詳しく見たい場合は、 http://umich.edu/~eecs381/lecture/IdiomsDesPattsCreational.pdf
シングルトンクラスを正しく作成する方法は2つあります。
最初の方法:
例にあるのと同じように実装します。破壊に関しては、「シングルトンは通常、プログラムの実行期間中存続します。ほとんどのOSは、プログラムの終了時にメモリと他のほとんどのリソースを回復するため、これについて心配しないという議論があります。」
ただし、プログラムの終了時にクリーンアップすることをお勧めします。したがって、これを補助静的SingletonDestructorクラスで行い、それをシングルトンのフレンドとして宣言できます。
class Singleton {
public:
static Singleton* get_instance();
// disable copy/move -- this is a Singleton
Singleton(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton& operator=(Singleton&&) = delete;
friend class Singleton_destroyer;
private:
Singleton(); // no one else can create one
~Singleton(); // prevent accidental deletion
static Singleton* ptr;
};
// auxiliary static object for destroying the memory of Singleton
class Singleton_destroyer {
public:
~Singleton_destroyer { delete Singleton::ptr; }
};
Singleton_destroyerはプログラムの起動時に作成され、「プログラムが終了すると、ランタイムライブラリのシャットダウンコード(リンカーによって挿入された)によってすべてのグローバル/静的オブジェクトが破棄されるため、the_destroyerが破棄され、そのデストラクタがシングルトンを削除して実行します。デストラクタ。」
二番目の方法
これは、C ++ウィザードのScott Meyersによって作成されたMeyersシングルトンと呼ばれます。単にget_instance()を別の方法で定義します。これで、ポインターメンバー変数を取り除くこともできます。
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
返される値は参照によるものであり、.
代わりに構文を使用できるため、これは適切です->
メンバー変数にアクセスするです。
「コンパイラーは、宣言ではなく最初に「s」を作成するコードを自動的に構築し、その後はプログラムの終了時に静的オブジェクトを削除します。」
また、マイヤーズシングルトンを使用すると、「終了時にオブジェクトが相互に依存している場合、非常に困難な状況に陥る可能性があります。シングルトンが他のオブジェクトに対していつ消えるのですか?しかし、単純なアプリケーションの場合、これはうまく機能します。」