はじめましてBlueBackといいます。
シングルトンというものを知り自分でテンプレートを作成することで
プログラミングの勉強をしています。
しかし、経験や知識が浅いために具体的な検証が行えず次に
どこを改善すれば良いのかがわからない状態になってしまいました。
現在このソースコードを改善していくために必要な知識を調べることで
プログラミングの勉強をしていこうと考えているのですが
事実の確認、問題点の指摘、参考資料の紹介等の
アドバイスがありましたらをお願い致します。
現状は下記のようになっています。
開発はVC++ 2003でおこなっています。
//singleton.h
template <class TARGETCLASS> class TSingleton : public TARGETCLASS
{
private:
TSingleton(void){
// ホルダーに登録
}
~TSingleton(void){}
static TSingleton< TARGETCLASS >* instance;
public:
static TSingleton* Instance()
{
if(instance == NULL){
instance = new TSingleton< TARGETCLASS >;
}
return instance;
}
};
template <class TARGETCLASS> TSingleton< TARGETCLASS >* TSingleton< TARGETCLASS >::instance = NULL;
template <class T> inline T* Singleton(void)
{
return TSingleton< T >::Instance();
}
//ctest.h
class CTest
{
protected:
CTest(void){}
virtual ~CTest(void){}
public:
void Move(void)
{
// コード
}
};
//main.cpp
void main(void)
{
Singleton< CTest >()->Move();
}
スレッドセーフじゃないな
>参考資料
Modern C++ Designあたりとか?
って買ったけど読んでないや…
最初に一個newされたインスタンスは何時deleteされるんだろ?
編集 削除>…さん
ご指摘ありがとうございます。
確かに別スレッドから同時に初回呼び出しが発生した場合に複数
発生してしまう可能性があります。
スレッド安全性、可読性、オーバーヘッドを考慮に入れた改良を考えて見たいと思います。
>επιστημη
開放タイミングの難しさにをModern C++ Designを呼んで
すこし勉強させていただきました。
Meyers Singleton
不死鳥
寿命指定
シングルトンホルダー
いろいろとあるという事を知りましたが移植性のあるソースコードを
考えた場合にメモリーリークを回避するためにはシングルトンの有効範囲
をmain関数内に限定することで格段に可読性、安全性、移植性、保障が
あがるのではないかと考えました。
επιστημηさんの問いかけはそういう難しさを踏まえた上での
質問だと思うのですが
実際にmain関数内と限定した場合に
C++での開発で開発不可能に陥ってしまうほどの致命的な
条件破綻が発生することはあるのでしょうか?
>επιστημηさん
ご指摘ありがとうございます。
肝心の言葉が抜けていました申し訳ありません。
まずはModern C++ Designを読むことにします。
編集 削除