最近、C ++のシングルトンデザインパターンの実現/実装に出くわしました。それはこのように見えました(私は実際の例からそれを採用しました):
// a lot of methods are omitted here
class Singleton
{
public:
static Singleton* getInstance( );
~Singleton( );
private:
Singleton( );
static Singleton* instance;
};
この宣言から、インスタンスフィールドがヒープで開始されていると推測できます。これは、メモリ割り当てがあることを意味します。私にとって完全に不明確なのは、いつメモリの割り当てが解除されるのかということです。または、バグとメモリリークがありますか?実装に問題があるようです。
私の主な質問は、どうすればそれを正しい方法で実装できるかということです。
2008年に、遅延評価され、破壊が保証され、技術的にスレッドセーフではないシングルトンデザインパターンのC ++ 98実装を提供しました。C++
でシングルトンのサンプルを提供できる人はいますか?
これは、遅延評価され、正しく破棄され、スレッドセーフなシングルトンデザインパターンの更新されたC ++ 11実装です。
class S
{
public:
static S& getInstance()
{
static S instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
private:
S() {} // Constructor? (the {} brackets) are needed here.
// C++ 03
// ========
// Don't forget to declare these two. You want to make sure they
// are inaccessible(especially from outside), otherwise, you may accidentally get copies of
// your singleton appearing.
S(S const&); // Don't Implement
void operator=(S const&); // Don't implement
// C++ 11
// =======
// We can use the better technique of deleting the methods
// we don't want.
public:
S(S const&) = delete;
void operator=(S const&) = delete;
// Note: Scott Meyers mentions in his Effective Modern
// C++ book, that deleted functions should generally
// be public as it results in better error messages
// due to the compilers behavior to check accessibility
// before deleted status
};
シングルトンをいつ使用するかについては、この記事を参照してください:(頻繁ではありません)
シングルトン:どのように使用する必要がありますか
初期化順序とその対処方法については、次の2つの記事を参照してください。
静的変数の初期化順序
C ++の静的初期化順序の問題の検出
ライフタイムについて説明しているこの記事を参照してください:
C ++関数の静的変数のライフタイムはどれくらいですか?
シングルトンへのスレッドの影響について説明しているこの記事を参照してください
。GetInstanceメソッドの静的変数として宣言されたシングルトンインスタンス、スレッドセーフですか?
ダブルチェックロックがC ++で機能しない理由を説明するこの記事を参照してください
。C++プログラマーが知っておくべき一般的な未定義の動作は何ですか?
ドブス博士:C ++とダブルチェックロックの危険性:パートI
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加