3

私は次のようなクラスを持っています:

class A {
  SuperHugeClass* s;
public:
  A(){ s = new SuperHugeClass(); }
};

大量のメモリを消費するためSuperHugeClass、デフォルトのコンストラクタと代入演算子によって提供される浅いコピーで問題ありません。ただし、メモリをリークしたくないので、リークする必要がありますがdelete s、それ以外の場合は複数回削除するため、注意が必要です。

これを行う1つの方法はs、次のように再カウントすることです。

class A {
  int* refcount;
  SuperHugeClass* s;

public:
  A(){
    refcount = new int(1);
    s = new SuperHugeClass();
  }

  A(const A& other) : refcount(other.refcount), s(other.s) {
    (*refcount)++;
  }

  ~A() {
     (*refcount)--;
     if (!(*refcount)) {
       delete refcount;
       delete s;
     }
   }

  friend void swap(const A& a, const A& aa) {
    std::swap(a.refcount, aa.refcount);
    std::swap(a.s, aa.s);
  }

  A& operator=(A other) {
    swap(*this, other);
    return (*this);
  }
}; 

私がこのようなことをする必要があるのはこれが初めてですが、これはかなり標準的であるはずなので、「標準的な」解決策があるはずです。これを行う他の方法はありますか?ありがとう!

4

2 に答える 2

4

std::shared_ptrを使用する

class A {
  std::shared_ptr<SuperHugeClass> s;
public:
  A()
  : s(new SuperHugeClass())
  {
  }
};

以上です。デフォルトで生成されたコピーコンストラクタ/代入演算子/デストラクタは、必要なことを実行します。

于 2012-07-26T18:14:43.743 に答える
3

std/boost::shared_ptr参照カウントポインタの代わりに使用します。

于 2012-07-26T18:14:01.647 に答える