MST
星途 面试题库

面试题:C++ delete操作在复杂对象关系中的应用

假设有一个继承体系,基类`Base`有一个虚析构函数,派生类`Derived`继承自`Base`。现在有一个`Base* basePtr = new Derived();`,在使用`delete basePtr;`时,详细说明C++内部发生了什么,以确保资源的正确释放。如果基类析构函数不是虚函数,又会出现什么问题?
49.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 当基类析构函数是虚函数时
    • 当执行delete basePtr;时,由于basePtr指向Derived类型对象,且基类Base的析构函数是虚函数,C++运行时系统会根据对象的实际类型(即Derived类型)来调用相应的析构函数。
    • 首先调用Derived类的析构函数。在Derived类的析构函数中,会清理Derived类中声明的成员变量所占用的资源,例如动态分配的内存等。
    • 然后,在Derived类析构函数执行完毕后,会自动调用基类Base的析构函数。基类Base的析构函数会清理Base类中声明的成员变量所占用的资源。这样就确保了整个对象(包括基类和派生类部分)所占用的资源都能被正确释放。
  2. 当基类析构函数不是虚函数时
    • 当执行delete basePtr;时,由于basePtr的静态类型是Base*,且基类Base的析构函数不是虚函数,C++只会调用基类Base的析构函数。
    • 这样就导致Derived类中声明的成员变量所占用的资源无法被清理,从而产生内存泄漏。因为Derived类的析构函数没有被调用,它内部动态分配的资源(如果有的话)就不能被释放。