私は解決しようとしている再帰的な問題があります。特定のアクションが可能な場合は、追加の子アクションなどが存在する可能性があります。デストラクタを使用してメンバーベクトル内のヒープ割り当てオブジェクトを削除する
// 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++で経験の浅い人で、直接の質問が私にとって最も役に立つと思った。
['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)や[' std :: shared_ptr']などのスマートポインタを使用してください(http: /en.cppreference.com/w/cpp/memory/shared_ptr)を使用して、生ポインタの代わりにオブジェクトの所有権を処理します。副作用として、あなたの質問は疑問になるでしょう。 –
あなたのクラスがその子供を所有しているかどうかを決定する必要があります。そうであれば上記のコードを実行する必要があります。 – Spads
スマートポインタが必ずしもその日を保存するとは限らないことを指摘したいと思います。彼らは彼ら自身の問題を持っています。プロジェクト全体で使用することを決める前に、http://stackoverflow.com/questions/1905787/pros-and-cons-of-smart-pointersをチェックしてください。 – Spads