7

私のクラスには、メンバー変数がありますstd::vector<node*> children

次のクラス メンバー関数はメモリ リークを引き起こしますか?

//adds a child node
{
    node* child = new node("blah","blah","blah");
    child->Set_Parent(this);
    children.push_back(child);  //<- Is this ok?
}

ベクトルはポインターのコピーを作成し、同じメモリへの 2 つのポインターを持っていると、元のポインターは範囲外になりますよね?

これは単純明快かもしれませんが、私の仮定を確認したいと思います。
ありがとう

4

5 に答える 5

13

それは漏れではありません...まだ。ただし、vectorが範囲外になった場合erasepop_backまたはベクトルから要素を削除する何かを行った場合、削除する要素を最初にdeleteing せずに、手にリークが発生します。

これを行う正しい方法は、使用を to から変更するvector<node *>ことvector<unique_ptr<node>>です。コードは次のように変わります

//adds a child node
{
    node* child = new node("blah","blah","blah");
    child->Set_Parent(this);
    children.push_back(std::unique_ptr<node>(child));
}

またはboost::ptr_vector<node>、Boost が使える場合に使用します。

于 2012-09-16T06:08:16.697 に答える
2

ベクトルのデストラクタを含むクラスが呼び出されたときに子ノードの割り当てを解除するのを忘れた場合、メモリ リークが発生するだけです。

于 2012-09-16T05:59:14.567 に答える
1

メモリリークではありません。ベクトルにはまだポインターがあり、必要に応じてメモリを解放できます。

于 2012-09-16T05:59:25.247 に答える
1

ベクトルが範囲外になると、デストラクタはポイント先のオブジェクトを破棄しません。ポインターを破棄します -- 何もしません。

あなたのコードは、 を介してそのオブジェクトを作成しましたnew。あなたのコードは、そのオブジェクトを削除する責任があります。そうしないと、漏れがあります。早い段階で、つまりベクトルからポインターを削除する前に行うと、さらに大きな問題が発生します。

于 2012-09-16T06:00:50.263 に答える
-3

がクラス メンバーであると仮定するchildrenと、クラス デコンストラクターのベクター内のすべての項目を単純に削除するだけです。

struct Foo{};

class Bar
{
public:
    Bar(){};
    ~Bar()
    {
        for( vector<Foo*>::iterator it = children.begin(); it != children.end(); ++it )
        {
            SAFE_DELETE( (*it) ); //use your own macro/template or use delete if you don't have one
            delete (*it);
            (*it) = NULL;
        }
    }
    vector<Foo*>children;
}

Foo* p = new Foo();
children.push_back( p );

vector<Foo>child代わりにa を使用した場合push_back、ベクトル上のすべてのオブジェクトは格納される元のオブジェクトのコピーを作成しますが、ポインターを使用しているため、この場合newはオブジェクト コピーによってヒープに割り当てられず、a を指すポインターが作成されます。長期間のオブジェクトは単純に保存されます。つまり、後で削除する必要があります。

于 2012-09-16T06:04:36.040 に答える