0

シングルトン クラスを作成しましたが、デストラクタ関数が という名前の静的変数のメモリを自動的に解放するかどうか疑問に思っていますinstance

次のコードは自動的にメモリを解放しますか?

class SingletonClass
{
    SingletonClass() 
    {

    }

    ~SingletonClass()
    {
       delete this; // or should I say... delete instance;
    }

    public:

    static SingletonClass* instance;

    SingletonClass* getInstance()
    {
       if (instance != NULL)
          return instance;

       instance = new SingletonClass();
       return instance;
    }
};

instancePS:ポインターではなく、通常のシングルトン変数を作成することは可能ですか? それはより良いコード練習でしょうか?

4

2 に答える 2

4

このシングルトン クラスは、プログラムにUndefined Behaviorを陽気に​​注入します。

自動ストレージを持つstaticメンバー変数があります。グローバル変数として、main()ルーチンに入る前に構築され、ルーチンの終了後に破棄されますmain()

したがって、プログラムが終了してmain()関数を終了すると、インスタンスのデストラクタSingletonClassが呼び出され、次のことを試みdelete thisます。ただし、オブジェクトは への呼び出しによって割り当てられておらず、割り当てられていないオブジェクトをnew呼び出すと、未定義の動作が発生します。deletenew

この命令は安全に削除できdelete thisます。プログラムが終了すると、グローバル オブジェクトは自動的に破棄されます。

編集:

あなたの質問を編集した後、 type の変数だったstaticものが typeの変数にSingletonClassなりました。元に戻すことをお勧めします:staticSingletonClass*

static SingletonClass instance;

SingletonClass* getInstance()
{
    return &instance;
}

実際には、 function のローカル変数でさえあるinstance可能性があります (おそらくそうあるべきです) :staticgetInstance()

SingletonClass* getInstance()
{
    static SingletonClass instance;
    return &instance;
}

この方法では、クラス メンバー変数のグローバル定義を提供する必要さえありません。static

別の方法として、スマート ポインターを使用してオブジェクトの有効期間を管理することもできますが、ここでは不要です。static変数を のローカル変数として宣言するだけですgetInstance()C++11 では、その初期化もスレッドセーフであることが保証されます。

于 2013-02-21T02:24:48.723 に答える
3

次のようなスマートポインターを使用します

 static std::unique_ptr<SingletonClass> instance;

プログラムが終了すると、インスタンスが削除されます。delete this自分が何をしていて、何が結果であるかを本当に理解していない限り、コードのメンバーを避けてください。

于 2013-02-21T02:30:24.597 に答える