派生类包含指向基类对象的指针时的析构函数
Destructor when derived class contains a pointer to base class object
我已经编写了一个纯虚拟析构函数,并在抽象基类中实现了它,并在派生类中重写它。
然而,在其中一个类中,我有一个指向基类对象的指针
现在,派生类的析构函数应该这样写吗:
virtual ~DerivedClass()
{
delete this->pointerToAnotherDerivedClassObject;
}
还是会自动删除对象?由于基类析构函数总是被调用的,所以我无法决定它是否处理它。
EDIT:我错误地说它是指向基类的指针,因为它实际上是指向另一个派生类对象的指针。
然而,在其中一个类中,我有一个指向基类对象的指针。现在,派生类的析构函数应该这样写吗
由于pointerToAnotherDerivedClassObject
指向内存中的另一个对象,因此是的,您的DerivedClass
析构函数需要显式地delete
该对象(或将原始指针封装在智能指针std::auto_ptr
、std::unique_ptr
或std::shared_ptr
中,并使其成为您的对象delete
)仅当DerivedClass
要拥有另一个对象时。否则,如果您不拥有它,就不要delete
。
@Elia类似的情况在Eckel的书"C++中的思考vol-2"中的设计模式第10章中讨论了伪虚拟构造函数。问题的答案是,考虑到动态分配,您确实需要删除它。此外,不要将成员Base*与Base对象混淆,后者是由于继承而派生的一部分,一个是数据成员(这是您想要删除的),另一个是由于继承。
相关文章:
- 优先顺序:智能指针和类析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 如何将析构函数分配给指针
- 智能指针析构函数争用条件
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 在C++中删除指针数组时析构函数崩溃
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 删除析构函数C++中的指针
- 构造函数是否unique_ptr初始化原始指针unique_ptr析构函数是否也删除关联的原始指针?
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 在析构函数内取消引用指针时出现分段错误
- 共享指针析构函数中的内存顺序
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- 在特殊情况下使析构函数不是虚拟的,并删除基指针是否安全
- 删除对象而不调用成员指针的析构函数
- 析构函数在与 STL 的共享指针中调用两次