1

次のベクトルがあります。

std::vector<xml::Node *> *children;

私のデストラクタでは、子deleteの要素が指す要素を明示的に呼び出す必要がありNode *ます。だから私は次のことをします:

std::cout << "xml::Element destructor" << std::endl;
if(children != NULL) {
    if(n_children() > 0) {
        for (int i = 0; i < n_children(); i++) {
            delete children[i];
        }
    }
    delete children;
}

しかし、次のエラーが表示されます。

oops.cpp: In destructor ‘virtual xml::Element::~Element()’:
oops.cpp:277:42: error: type ‘class std::vector<xml::Node*>’ argument given to ‘delete’, expected pointer

どうすればこれを修正できますか?

4

1 に答える 1

3
delete children[i];

する必要があります

delete (*children)[i];

childrenポインタだからです。

まあ、それは構文レベルでのコードの問題ですが、上記の構文を修正した後でも、設計レベルではまだ問題があると思います。なぜchildrenポインターとして宣言したのですか?なぜこれだけではないのですか:

std::vector<xml::Node*> children; //non-pointer now

これを選ばなかった明確な理由はありますか ?

ほとんどの場合、コンテナをポインタとして宣言することは、メモリ管理に関する限り、まさにその目的に反します。メモリ管理を自分で処理したくないため、コンテナーを使用します。代わりに、コンテナ自体にその負担を負わせたいと考えています。コンテナは、範囲外になるとすべてのリソースを自動的に解放します。ただし、コンテナーをポインターとして宣言すると、コンテナーを削除する負担がかかります。これを怠ると、コンテナは取得したリソースを解放せず、メモリ リークが発生します。

于 2013-03-04T05:27:09.903 に答える