C++ 根据父级指针删除子级
Posted
技术标签:
【中文标题】C++ 根据父级指针删除子级【英文标题】:C++ deleting children basing on parent's pointer 【发布时间】:2020-09-13 05:58:38 【问题描述】:假设我有 A 类:
class A
A();
;
而 B 类是 A 的孩子:
class B : public A
B() : A();
~B();
;
和一个 A 指针向量:
std::vector<A*> a_pointers;
现在,我初始化所有内容:
B* b_obj = new B();
a_pointers.push_back(b_obj);
如何删除 b_obj 对象?应该是这样的吗?
delete a_pointers[0];
它会起作用吗?如果没有,应该怎么做?
【问题讨论】:
只要析构函数在base中声明为virtual,对父指针delete就会调用派生类的析构函数 【参考方案1】:您需要给 A 一个虚拟析构函数(请参阅 here 了解原因):
class A
A();
public:
virtual ~A() = default;
;
此时调用delete a_pointers[0]
将完全破坏b_obj
。
【讨论】:
【参考方案2】:如果你专门引用了局部变量B* b_obj
,那么你不需要删除它。局部变量驻留在堆栈中,当您从声明它的函数返回时将被清除。
如果您指的是创建并分配给 B* b_obj
的对象(即由 new() 创建的对象,然后它的引用被复制到向量中),那么您需要通过以下方式显式删除它稍后调用delete()
(您可能需要遍历向量并删除其所有项目)。
另一件需要注意的重要事情是,您还需要像 Nathan Pierson 所说的那样将您的析构函数声明为虚拟的。
【讨论】:
以上是关于C++ 根据父级指针删除子级的主要内容,如果未能解决你的问题,请参考以下文章
尝试从父级 IOS swift 3 中删除子级时,我的代表为零
Hibernate @OneToMany 在更新父级时从列表中删除子级