2013-02-21 15 views
6

ここに私の構造はC++では、構造体へのポインタのメモリを解放するためのデストラクタを書く方法は?

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

Bだが、私は、コード

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

の下に使用上の後、私は自由にすべての/削除する必要が

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 <---- 
    } 
}; 

へのポインタが含まれている別の構造体でありますptrBが指すメモリ。したがって、構造体Bの中に正しいデストラクタを書く必要があります。Aで指し示されている各要素をトラバースして削除するにはどうすればよいですか?

+2

C++の本が必要です。あなたは、 'C'からのものと、自動変数を' delete'しようとしています。さらに、 'A'でトラバースするものは何もありません - あなたは' ptr2Aを削除するだけです。 – Yuushi

+1

なぜb1を削除するのですか? – StarPinkER

+0

[クラスにポインタがあるときにデストラクタを書き込む方法は?](http://stackoverflow.com/questions/5317735/how-to-write-destructor-when-i-have-pointers-in-class) – jogojapan

答えて

12

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

#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 

Here's more info:あなたが何かを割り当てるたび

#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! 
}; 

は、共有のポインタを使用してください。

また、C++ 11コンパイラをお持ちでない場合は、BOOST libraryから共有ポインタを取得できます。

+0

申し訳ありません。私は長い間型を取った。私は質問に詳細を追加しました。私は後で新しいオペレータを使用します – user13107

+0

ありがとう!だから、あなたは 'ptrBを削除する'だけをする必要があり、それはすべて世話をするでしょうか? – user13107

+0

スマートポインタを使用している限り、削除する必要はありません。さまざまな種類のスマートポインタがありますが、今のところshared_ptrで始まります。 – Carl

4

Aへのポインタが1つしかありません。それは、プレーンintなので、

~B() { 
    delete ptr2A; 
} 

注意あなたがdelete B1ことができない。だから、それだけで削除する必要があります! (メモリは、b1ような構造の変数、ポインタptr2A自体(それを指していないもの)は、その構造のすべてのインスタンスと一緒に自動的に破棄されることによって取り込ま。)あなただけにdeleteオブジェクトが割り当てられた必要

+0

申し訳ありません。私は長い間型を取った。私は質問に詳細を追加しました。私は後で – user13107

5

new。この場合、動的に割り当てられていないので、b1を削除する必要はありません。さらに、ptr2aをダイナミックメモリで初期化しなかった場合、それを削除することは未定義の動作です。

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

+0

の新しい演算子を使用します。私は長い間型を取った。私は質問に詳細を追加しました。私は後で新しい演算子を使います。 – user13107

+0

あなたがする必要があるのは、それが指しているメモリを使い終わったら 'delete ptrB'を使うことだけです。クラスの中でそれをしないでください、あなたがそれを定義したメインの中で行います。 – 0x499602D2

+0

Ah。私は、 'delete ptrB'コードがBのデストラクタを呼び出すという印象を受けました。だから、Bのデストラクタの中で(aa1が指すメモリを解放する)必要があります。 – user13107

関連する問題