1

このようなシングルトンパターンを作成する2つの方法を知っています:

class sgt_static
{
    sgt_static() { }
    public:
        static sgt_static* get_instance()
        {
            static sgt_static instance;
            return &instance;
        }
}

この:

class sgt_new
{
    sgt_new() { }
    public:
         static sgt_new* get_instance()
         {
             static sgt_new* instance = NULL;
             if ( instance == NULL ) instance = new sgt_new();
             return instance;
         }
}

私はそれらの間のいくつかの違いを知っていました:

  1. のインスタンスはsgt_new自分で削除する必要があります。
  2. プログラムが(通常)終了すると、のインスタンスはsgt_staticプログラム自体(またはOS?)によって削除されます。

しかし~sgt_new()、プログラムが終了すると、デバッガーには中断アクションがまったくありません。OS がこれらのリソースを再利用すると誰かが言っています。本当 ?では、インスタンスのsgt_newメモリ リークは発生しませんか?

私のリストの上記のポイントとは別に。シングルトンの2つの実装の間に他の違いはありますか?

4

1 に答える 1

0

何かが呼び出されない限り、ヒープ上のオブジェクトは C++ システムによって削除されませんdelete。つまり、2 番目のバージョンのオブジェクトは破棄されません。オブジェクトの使用方法によっては、これは非常に意図的なものかもしれません。オブジェクトを関数でラップすると、オブジェクトが構築される前にアクセスされないことが保証されますが、破棄された後にアクセスされるようにすることもできます。結局、ポインターが渡された場所を制御することはできません。

プログラムが終了すると、読み取りが何であれ、リソースはプログラムの外部から回収されます。これがいつどのように行われるかは、オペレーティング システムによって異なり、さまざまなリソースがさまざまなタイミングで再利用される場合があります。このリソースのクリーンアップはデストラクタを呼び出さ、ファイル記述子 (または同等のもの)、メモリ、ロックなどのリソースを利用可能にするだけであることに注意してください。つまり、シングルトンのデストラクタに重要なオブジェクトがある場合は、おそらく最初のアプローチを使用する必要があります。

とはいえ、シングルトンは、ある種のグローバルメモリの美化が疑われるため、非常に過剰に使用されています! シングルトンの正当な使用法はいくつかありますが、あなたのケースがそれらのいずれでもないことを示しています。シングルトンかどうかを判断する方法は、同じ実行可能ファイルで実行されているプログラムの 2 つ (またはそれ以上) のバージョンが同じシングルトンを引き続き使用できるかどうかを判断することです。そうでない場合、それはシングルトンの正当な使用ではありません。

于 2012-09-22T16:33:51.467 に答える