1

次のクラス宣言を検討してください。

#include "classB.h"
class A {
private:
    B *prop;

public:
    A() { /* does stuff to set up B as a pointer to a new B */
    setB(const B& bar) { /* store a copy of B */
        // how do I manage the old *prop?
        *prop = new B(bar);
    }
};

setB()メモリ割り当てをどのように管理する必要がありますか? 古いものを削除する必要があり*propますか? もしそうなら、逆参照してからdeleteですか?

4

3 に答える 3

5

まず、コンストラクターで を設定propする必要がありNULLます。そうしないと、設定しようとすると未定義の動作が発生しますdelete

次に、逆参照せず、ポインタを割り当てるだけです。

第三に、デストラクタでメモリを削除して、リークが発生しないようにする必要があります。

最後に、デストラクタを実装する場合は、コピー コンストラクタと代入演算子も必要です。

class A {
private:
    B *prop;

public:
    //set prop to NULL so you don't run into undefined behavior
    //otherwise, it's a dangling pointer
    A() { prop = NULL; }

    //when you set a new B, delete the old one
    setB(const B& bar) { 
        delete prop;
        prop = new B(bar);
    }

    //delete prop in destructor
    ~A() { delete prop; }

    //because you now have a destructor
    //implement the following to obey the rule of three
    A& operator = (const A& other);  //assignment operator
    A(const A& other);               //copy constructor
};
于 2012-04-27T23:37:15.840 に答える
2

割り当てがスローされた場合に操作前のオブジェクトの状態を維持するには、次のように実装することをお勧めします。

void setB(const B& bar)
{
    // Do this first, since it could throw.
    B *newProp = new B(bar);

    // Now delete the old one and replace it with the new one.
    delete prop;
    prop = newProp;
}

ここを参照してください(特に、強力な例外保証に関するビット):

http://en.wikipedia.org/wiki/Exception_guarantees

于 2012-04-27T23:54:53.317 に答える
0

コンストラクターが常にnew を割り当てる場合、そのスペースを他のオブジェクトBのコピーに再利用できます。B

A() { /* does stuff to set up prop as a pointer to a new B */
}

setB(const B& bar) { /* store a copy of B */
    *prop = bar;
}

propデストラクタで削除することを忘れないでください。

于 2012-04-27T23:44:52.370 に答える