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「削除」しようとしています。aa
-私は 2 つのポインタ (1 つは にB、もう 1 つは にC) を両方とも ( の ) 同じアドレスを指してaおり、D のデストラクタがb(次に を呼び出すdelete a) を削除すると、このメモリは解放済みとして設定されます。
- のデストラクタが をD削除するとc、すでに割り当てが解除されているために失敗するように、独自cに呼び出そうとします。delete aa
私はC++は比較的初めてですが、プログラミングは初めてではありません。これを調べたところ、スマート ポインター (shared_ptr など) がこれを解決できることがわかりましたが、この場合のベスト プラクティスは何ですか? 2 つの個別Aのオブジェクトを作成する必要がありましたか?