クラスのメンバ(アクセスレベルを問わず)にポインタを含む場合、コピーコンストラクタを自作しないとクラスオブジェクトをコピーする場合に正しく動作しない。
#include <vector>
class A
{
protected:
int *p;
public:
class A()
{
p = new int();
}
class ~A()
{
delete(p);
}
};
int main()
{
A _a;
vector<class A> _vect;
_vect.insert(_a);
// この段階で内部的にコンストラクタ/
// デストラクタが呼ばれるため、
// A#p が解放されてしまう。
//
以降の処理では、_vect[0].pも、_a.pも
// 解放された同じ領域を示すことになる
};
class A
{
protected:
int *p;
public:
class A()
{
p = new int();
}
// コピーコンストラクタを追加する
class A(const A & obj)
{
p = new int();
*this->p = *obj.p; // 値のコピー
}
class ~A()
{
delete(p);
}
};