アットウィキロゴ

ポインタを含むメンバを持つクラスを作る場合

クラスのメンバ(アクセスレベルを問わず)にポインタを含む場合、コピーコンストラクタを自作しないとクラスオブジェクトをコピーする場合に正しく動作しない。

(正しく動作しない例)

#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);
        }
};

 

タグ:

C++
最終更新:2010年03月22日 19:22