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++ 根据父级指针删除子级的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:删除未由子级引用的父级

尝试从父级 IOS swift 3 中删除子级时,我的代表为零

如何在 django 中根据子级过滤父级

Hibernate @OneToMany 在更新父级时从列表中删除子级

C++ 虚拟方法:我必须在父类中为子级和父级不共享的每个方法创建一个虚拟方法吗?

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?