最後に一度だけの後始末

[戻る]
Mitinagi 2004/07/14(水) 00:48:24
はじめまして。

ただ今、Win32APIのラッパークラスを作っているのですが、
そのクラスの中で、最初に一度だけ初期化関数を呼ぶ、
最後に(プログラムが終了するとき)一度だけ後始末の関数を呼ぶ
ということをしたいのです。初期化のほうはフラグを持たせればできますが、
後始末の方はどうすればいいのか悩んでいます。
このクラスは singleton パターンを使っているので、
デストラクタの中で、

if( this = m_pInstance/*このクラスの型のstatic 変数*/ )
{
    最後の後始末
} 

というようにしたのですが、この実装はよいのでしょうか。

MASATO [E-Mail] [HomePage] 2004/07/14(水) 07:30:44
その実装はコンパイルできないと思うのですが、いかがでしょうか。

Mitinagi 2004/07/14(水) 08:58:41
あ、すみません。
this = m_pInstance
ではなくて、
this == m_pInstance
です。m_pInstance は、唯一のインスタンスを指すstaticなポインタです

たく [E-Mail] 2004/07/14(水) 10:20:09
なんかよくわかりませんが、
フラグの替わりにカウンタを使えばよいのではないでしょうか?

九条 2004/07/14(水) 10:46:32
わたしは、シングルトンの実体をnewで確保したときなどの後始末を
プログラムの終了後にするとき、

class CUninitializer {
  CUninitializer() {}
  ~CUninitializer() {
     // 後始末
     WSACleanup(); // 例
  }
};
static CUninitializer s_uninitializer;

とかしています。
mainが終了後に、大体の場合においてCUninitializerの
デストラクタが働いて、解放処理をやってくれます。
ただ、staticな領域のデストラクタの実行順は不定なので、
他のクラスとの依存関係が存在するといろいろ面倒だったりします。

PAI 2004/07/14(水) 14:09:32
stdlib に int atexit(void (*function)(void)) 
という関数がありますが、どうなんでしょうかね。

古いスレッドには追加発言できません。