私は次のようなクラスを持っています:
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);
}
};
私がこのようなことをする必要があるのはこれが初めてですが、これはかなり標準的であるはずなので、「標準的な」解決策があるはずです。これを行う他の方法はありますか?ありがとう!