【问题标题】:Using delete operator in a pointer in vector在向量中的指针中使用删除运算符
【发布时间】:2013-03-04 05:25:04
【问题描述】:

我有以下向量:

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

在我的析构函数中,我需要在子元素中Node * 指向的元素上显式调用delete。所以我做了以下事情:

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

我该如何纠正这个问题?

【问题讨论】:

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


    【解决方案1】:
    delete children[i];
    

    应该是

    delete (*children)[i];
    

    因为children 是一个指针。

    嗯,这就是您的代码在语法级别的问题,尽管我觉得即使您修复了上述语法,设计级别仍然存在问题。为什么将children 声明为指针?为什么不只是这样:

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

    你有什么可靠的理由不选择这个吗?

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

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      相关资源
      最近更新 更多