10

これが私の構造Aです

struct A {
    int a1;
    int a2;
    ~A() { }
};

BAへのポインタを含む別の構造体です

 struct B {
    B(int b, A* a)
      : b1(b), ptr2A(a)
    {}
    int b1;
    A* ptr2A;

    ~B() {
         delete b1;
         // traverse each element pointed to by A, delete them <----
    }
};

後で私は以下のコードを使用します

int bb1;
vector <A*> aa1;
// do some stuff
B *ptrB = new B(bb1, aa1);

ptrBが指すすべてのメモリを削除/解放する必要があります。したがって、構造体B内に正しいデストラクタを記述する必要があります。Aが指す各要素をトラバースして削除するにはどうすればよいですか?

4

3 に答える 3

19

C ++ 11コンパイラを使用している場合は、std :: shared_ptrを使用するだけで、削除について心配する必要はありません。これは、shared_ptrが、それが指しているものを自動的に削除する「スマート」ポインターであるためです。

#include <memory>
struct B 
{
    int b1;
    std::shared_ptr<A> ptr2A;
    B(int b, std::shared_ptr<A> a):b1(b),ptr2A(a)({}
    ~B(){} //look ma! no deletes!
};

何かを割り当てるときは常に共有ポインタを使用してください。

#include<memory>
...
{
    ....
    std::shared_ptr<B> ptrB( new B(bb1, aa1) );
    //Here is another, more readable way of doing the same thing:
    //auto ptrB = std::make_shared<B>(bb1,aa1);
    ...
}
//no memory leaks here, because B is automatically destroyed

スマートポインタの主題に関する詳細は次のとおりです。

また、C ++ 11コンパイラがない場合は、 BOOSTライブラリから共有ポインタを取得できることにも言及しておく必要があります。

于 2013-02-21T03:06:11.913 に答える
6

deleteによって割り当てられたオブジェクトにのみ必要ですnew。この場合、b1動的に割り当てられていないため、削除する必要はありません。ptr2aさらに、動的メモリで初期化していない場合、それを削除することは未定義の動作です。

Aしたがって、データはクラスのインスタンスに沿ってメモリから破棄されるため、データの削除について心配する必要はありません。

于 2013-02-21T03:00:59.057 に答える
5

へのポインタは1つだけAです。したがって、削除する必要があるのは次のとおりです。

~B() {
     delete ptr2A;
}

deleteプレーンなのでb1はできないことに注意してくださいintb1(およびポインタ自体(それが指すものではない)などの構造体の変数によって使用されるメモリは、ptr2Aその構造体のインスタンスとともに自動的に破棄されます。)

于 2013-02-21T02:56:43.477 に答える