我有以下矢量:
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
我该如何纠正?
答案 0 :(得分:3)
delete children[i];
应该是
delete (*children)[i];
因为children
是指针。
嗯,这是你的语法级别的代码问题,虽然我觉得即使你修复了上面的语法后仍然存在设计级别的问题。为什么要将children
声明为指针?为什么不呢:
std::vector<xml::Node*> children; //non-pointer now
你有没有实体的原因你没有选择这个?
在大多数情况下,将容器声明为指针,就内存管理而言,无视其目的。您使用容器是因为您不想自己处理内存管理。相反,你希望容器本身承担这个负担。当容器超出范围时,容器会自动释放所有资源。但是,如果您将容器声明为指针,那么您将承担删除容器的负担。如果你错过了这个,那么容器将永远不会释放它已经获得的资源,并且会有内存泄漏。