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 回答