[解決済み] C++シングルトンデザインパターン
質問
最近、C++のSingletonデザインパターンの実現・実装にぶつかった。それは次のようなものでした(実例から採用しました)。
// a lot of methods are omitted here
class Singleton
{
public:
static Singleton* getInstance( );
~Singleton( );
private:
Singleton( );
static Singleton* instance;
};
この宣言から、インスタンス・フィールドはヒープ上で開始されることが推測できます。つまり、メモリの割り当てが行われているのです。私にとって全く不明なのは、そのメモリが正確にいつ割り当て解除されるのか?それともバグやメモリリークがあるのでしょうか?実装に問題があるように思えます。
私の一番の疑問は、どうすれば正しい方法で実装できるのか、ということです。
どのように解決するのですか?
2008年に私は、遅延評価、破壊保証、技術的にはスレッドセーフではない、SingletonデザインパターンのC++98実装を提供しました。
どなたかc++でSingletonのサンプルを提供していただけませんか?
ここでは、遅延評価、正確な破棄、そして、Singletonデザインパターンの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++とダブルチェック・ロックの危険性。パート1
関連
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み】PHP5でSingletonデザインパターンを作成する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Enterキーを押して続行する