如何解决C ++删除基于父级指针的子级
假设我有A类:
cout<<char(220)
并且B类是A的孩子:
class A {
A();
};
和A指针的向量:
class B : public A {
B() : A();
~B();
};
现在,我使用以下命令初始化所有内容:
std::vector<A*> a_pointers;
如何删除b_obj对象?应该是这样吗?
B* b_obj = new B();
a_pointers.push_back(b_obj);
行得通吗?如果没有,应该怎么做?
解决方法
您需要为A提供一个虚拟析构函数(有关原因,请参见here)
class A {
A();
public:
virtual ~A() = default;
};
此时调用delete a_pointers[0]
将完全破坏b_obj
。
如果您专门引用局部变量B* b_obj
,则无需删除它。本地变量位于堆栈中,当您从声明该函数的函数返回时将对其进行清理。
如果要引用创建并分配给B* b_obj
的对象(即,由new()创建的对象,然后将其引用复制到向量中),则需要将其删除稍后在某个时间明确地调用delete()
(您可能需要遍历向量并删除其所有项)。
值得注意的另一件事是,您还需要像Nathan Pierson所说的那样将析构函数声明为虚拟的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。