2007年2月28日水曜日

インスタンス破棄の方法

今日(もう昨日か)、業務で既存のコードを改造してて、ちょっと現実装に疑問を持ったのでメモ。ちなみに言語はC++。

以下のようなSingltonパターンで実装されたクラスがあったとします。
#元ネタは私が設計したクラスじゃないので質疑は却下。

class SmplCls
{
public:
  virtual ~SmplCls();
  static SmplCls* instance ();
  static void release ();

protected:
  SmplCls();

private:
  SmplCls(const SmplCls &right);
  SmplCls & operator=(const SmplCls &right);
  static SmplCls* m_SmplCls;
}

// インスタンス生成
SmplCls* SmplCls::instance()
{
  if (m_SmplCls == 0)
  {
    m_SmplCls = new SmplCls();
  }
  return m_SmplCls;
}

// インスタンス破棄
void SmplCls::release()
{
  if (m_SmplCls != 0)
  {
    delete m_SmplCls;
    m_SmplCls = 0;
  }
}

他のクラスからインスタンスを取得したいときは

  SmplCls::instance();

で良いとして、インスタンス破棄の際に

  SmplCls::instance()->release();

ってゆーのはアリなんだろうか?
取得したインスタンスからコールしたメソッド内で、インスタンスを破棄って…
最悪エラーになったりしないの???
#自分はてっきり「SmplCls::release();」の様に使用されてると思ってました;

上記クラスをコールするよう実装したら、デバッグ中断でエラーログ吐きまくるんで、物凄く気になってます。

…誰か助言くださいまし。お願いします(T_T)