2017-10-09 5 views
0

他の型へのポインタを含むシンプルなシングルトンクラスをC++で作成したいと思います。シングルトンクラスからオブジェクトを削除する

シングルトンはある時点でそのポインタの所有者になります。

だから、型テストのオブジェクトを削除し、シングルトンのデストラクタでそれのメモリを解放するための良い方法このう?。

class Test{...}; 
class Singleton 
{ 
    public: 
    static Singleton& getInstance() 
    { 
     static std::unique_ptr<Singleton> instance(new Singleton()); 
     return *instance.get(); 
    } 

    void SetTest(Test* test); 
    Test* GetTest() const; 
    ... 
    private: 
     Singleton(){} 
     ~Singleton(){ if(test) delete test;} // ?? 
     Test* test; 
    ... 
}; 

PS:Testオブジェクトにはスマートポインタを使用できません。

+0

あなたは "他の型のオブジェクトへのポインタ"を意味していると思います。型へのポインタはありません – user463035818

+1

おそらくコンストラクタで 'test'を初期化するべきでしょう。そうでなければ、ユーザが決して 'SetTest'を呼び出さなければ、' GetTest'は無効なポインタを返し、デストラクタは割り当てられていないものを削除しようとします。 –

+3

厳密に言えば、シングルトンは反パターンです。おそらくあなたが所有する必要があるものは、あなたのコードでより大きなアンチパターンを示すでしょう。 – StoryTeller

答えて

1

この質問にはいくつかの結論を出すために:はい、提案するようにオブジェクトを削除するのは一般的に問題ありません。しかし、すでにコメントで指摘されている次の点に注意し、気にしてください。

  • シングルトンのコンストラクタでnullptrtestを初期化することを確認します。そうしないと、ランダムなメモリアドレスを削除しようとする可能性があります。 (一部のプログラマーの方)
  • デストラクタでnullptrを確認する必要はありません。 nullptrを削除すると一般的に安全で何もしません。 (Massimiliano Janesとhere
  • スマートポインタを使用することができます。 (あるプログラマの男、Massimiliano Janes)
関連する問題