1

このドキュメントの937 ページに、次のコードがあります。

template<class T> class Safe
{
    T* p;  // p points to a T allocated using new
    public:
    Safe() : p(new T) {}
    ~Safe() { delete p; }
    Safe& operator=(const Safe& a) { *p = *a.p; return *this; }
    // ...
};

p が指すオブジェクトは、上記の代入演算子でリークされるようです。

4

3 に答える 3

4

彼はポインターを変更していないため、リークではありません。彼がした場合

Safe& operator=(const Safe& a) { p = a.p; return *this; }

その場合、メモリ リークが発生します。彼は、p 自体ではなく、p が指すオブジェクトに代入を行っています。

于 2012-12-24T21:02:02.527 に答える
3

いいえ。ポインターを変更していないため、リークはありません。もちろん、まだコピー コンストラクターがありませんが、それ以上のエラーはありません。

于 2012-12-24T21:01:31.013 に答える
1

割り当ては問題ではありません。割り当てられるのはポインターではなく、値を指しているからです。Tの割り当てが例外セーフであると仮定すると、Safe<T>のコピー割り当ても安全です。ただし、クラスにはコピー コンストラクターがありません。

于 2012-12-24T21:01:55.840 に答える