在向量中的指针中使用delete运算符

时间:2013-03-04 05:25:05

标签: c++ memory-management syntax-error

我有以下矢量:

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

我该如何纠正?

1 个答案:

答案 0 :(得分:3)

delete children[i];

应该是

delete (*children)[i];

因为children是指针。

嗯,这是你的语法级别的代码问题,虽然我觉得即使你修复了上面的语法后仍然存在设计级别的问题。为什么要将children声明为指针?为什么不呢:

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

你有没有实体的原因你没有选择这个?

在大多数情况下,将容器声明为指针,就内存管理而言,无视其目的。您使用容器是因为您不想自己处理内存管理。相反,你希望容器本身承担这个负担。当容器超出范围时,容器会自动释放所有资源。但是,如果您将容器声明为指针,那么您将承担删除容器的负担。如果你错过了这个,那么容器将永远不会释放它已经获得的资源,并且会有内存泄漏。