COMの関連知識 - 参照カウント

いちごパック > COM/ActiveXの解説 > COMの関連知識 - 参照カウント

参照カウント

クラスポインタのコピーを何度も生成すると、 deleteしても問題ないか判断することが難しくなります。 この問題を解決する方法の1つとして参照カウントがあります。
参照カウントを使う場合には、クラスに参照された数を持たせておきます。 例えば、先のIMyFileであれば次のようになります。
class IMyFile
{
public:
    void increment_ref() {
      m_ref++;
    }
    void decrement_ref() {
      if ( --m_ref == 0 )
        delete this;
    }
    // 読み込みのためのpure virtual メソッド
    virtual int read(void* pbuffer, int bufferlen) = 0;
    // 書き込みのためのpure virtual メソッド
    virtual int write(const void* pdata, int datalen) = 0;
protected:
    IMyFile() : m_ref(1) {}
    virtual ~IMyFile() {}
private:
    int m_ref;
};
ポインタをコピーするときにはincrement_ref()を、 ポインタを破棄したいときにはdecrement_ref()を呼び出します。
この方法を使えば、最後のポインタ参照が不要になった時点でクラスインスタンスを破棄できます。

参照カウントの欠点

参照カウントには欠点があり、2つのクラスがお互いのクラスへの参照を持つ(循環参照する)と、 参照カウントを1から減らせず、クラスインスタンスを破棄できなくなります。
解決方法としては、いずれかのクラスで参照カウントでの管理をあきらめ、 参照カウントを増やさずにクラスへのポインタを持つか、別の方法でクラスへの参照を管理することになります。

関連ページ

  • COM/ActiveXの解説ページ 目次
  • 前の項目: ファクトリクラス