C++ でメモリを適切に削除/割り当て解除する方法について質問があります。
次のものがあるとします... (A、B、C、D がクラスであると仮定します。B と C はインスタンス変数 を持ちますA* a
。D は 2 つのインスタンス変数を持ち、B* b
そしてC* c
)
A* a = new A();
B* b = new B(a);
C* c = new C(a);
D* d = new D(b, c);
B と C のデストラクタ:
B::~B() { delete a; }
C::~C() { delete a; }
D のデストラクタ:
D::~D() { delete b; delete c; }
今私が電話するとき
delete d;
「アクセス違反の読み取り場所 0xfeeefeee」が表示されます (私は Visual Studio 2010 を使用しています)。これだからだと思います
-のデストラクタは、既に割り当てが解除されている同じメモリ ( ) を 2 回D
「削除」しようとしています。a
a
-私は 2 つのポインタ (1 つは にB
、もう 1 つは にC
) を両方とも ( の ) 同じアドレスを指してa
おり、D のデストラクタがb
(次に を呼び出すdelete a
) を削除すると、このメモリは解放済みとして設定されます。
- のデストラクタが をD
削除するとc
、すでに割り当てが解除されているために失敗するように、独自c
に呼び出そうとします。delete a
a
私はC++は比較的初めてですが、プログラミングは初めてではありません。これを調べたところ、スマート ポインター (shared_ptr など) がこれを解決できることがわかりましたが、この場合のベスト プラクティスは何ですか? 2 つの個別A
のオブジェクトを作成する必要がありましたか?