gpt4 book ai didi

c++ - 在 vector 中的指针中使用删除运算符

转载 作者:行者123 更新时间:2023-11-30 02:56:47 30 4
gpt4 key购买 nike

我有以下 vector :

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

我该如何纠正这个问题?

最佳答案

delete children[i];

应该是

delete (*children)[i];

因为 children 是一个指针。

嗯,这是你的代码在语法层面的问题,虽然我觉得即使你修复了上面的语法,在设计层面仍然会有问题。为什么将 children 声明为指针?为什么不只是这个:

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

您有什么确凿的理由不选择它吗?

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

关于c++ - 在 vector 中的指针中使用删除运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15195091/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com