2017-05-04 7 views
1

私は解決しようとしている再帰的な問題があります。特定のアクションが可能な場合は、追加の子アクションなどが存在する可能性があります。デストラクタを使用してメンバーベクトル内のヒープ割り当てオブジェクトを削除する

// MyObj.h 
#include <vector> 
class MyObj 
{ 
    private: 
     std::vector<MyObj*> _children; 
    public: 
     void addChild(MyObj* m); 
} 

// MyObj.cpp 
#include "MyObj.h" 
void MyObj::addChild(MyObj* m) 
{ 
    MyObj::_children.push_back(m); 
} 

私はこのようなクラスを使用しています:私のソリューションは、このようなクラスがある

MyObj m; 
MyObj *child = new MyObj(); 
m.addChild(child); 

私の理解では、私は、ヒープ上childを割り当てられているので、私は後でそれを破壊する必要があるということです。そのオブジェクトを作成するコードがその参照を保持していない場合は、そのオブジェクトを破棄する親オブジェクトまでになります。それは、このようなデストラクタを定義することが適切である:これで正しい軌道に乗って

MyObj::~MyObj() 
{ 
    for (std::size_t i = 0; i < MyObj::_children.size(); i++) 
    { 
     delete MyObj::_children[i]; 
    } 
} 

アムIを、または私のアプローチは、欠陥がありますか?

PS:デストラクタを扱った疑問がたくさんあることを知っているので、これが直接の複製であることをお詫び申し上げます。私は束を読んだが、まだ自信を持っていなかった。私はC++で経験の浅い人で、直接の質問が私にとって最も役に立つと思った。

+2

['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)や[' std :: shared_ptr']などのスマートポインタを使用してください(http: /en.cppreference.com/w/cpp/memory/shared_ptr)を使用して、生ポインタの代わりにオブジェクトの所有権を処理します。副作用として、あなたの質問は疑問になるでしょう。 –

+1

あなたのクラスがその子供を所有しているかどうかを決定する必要があります。そうであれば上記のコードを実行する必要があります。 – Spads

+1

スマートポインタが必ずしもその日を保存するとは限らないことを指摘したいと思います。彼らは彼ら自身の問題を持っています。プロジェクト全体で使用することを決める前に、http://stackoverflow.com/questions/1905787/pros-and-cons-of-smart-pointersをチェックしてください。 – Spads

答えて

1

絶対に必要でない限り、newは使用しないでください。一旦それを行うと、動的に割り当てたメモリの割り当てを解除するのはあなたの責任です。上記のコードでは:関数はスコープの外に出るたら

MyObj m; 
MyObj *child = new MyObj(); 
m.addChild(child); 

mchildは、そのデストラクタ関数は、このようにそれらの両方を破壊し、それらが動的に割り当てられていないために求めています。

しかし、コンテンツは、それが動的new介してフリーストアに割り当てられたためはmchildと同様にを破壊されないchildポインタの指します。その場合は、上記のように、フリーストアに置いたオブジェクトごとにdeleteに電話する必要があります。

これは、RAIIのパラダイムに従うため、スマートポインタを使用することをユーザーが示唆している理由です。この場合、オブジェクトはスコープから外れると自動的に割り当てが解除されます。

関連する問題