MST

星途 面试题库

面试题:C++多态下虚拟析构函数对资源释放的影响

假设有一个基类Base和派生类Derived,在Base类中定义了一些资源(如动态分配的内存),且Base类的析构函数为虚函数。当通过Base类指针删除Derived类对象时,详细说明资源释放的过程,以及如果Base类析构函数不是虚函数会出现什么问题。
44.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

当Base类析构函数为虚函数时资源释放过程

  1. 调用Derived类析构函数:当通过Base类指针删除Derived类对象,由于Base类析构函数是虚函数,根据多态性,会首先调用Derived类的析构函数。在Derived类析构函数中,会清理Derived类自己新增的成员变量所占用的资源(如果有动态分配的内存等资源)。
  2. 调用Base类析构函数:在Derived类析构函数执行完毕后,会自动调用Base类的析构函数。Base类析构函数会释放Base类中动态分配的资源(如动态分配的内存)。通过这样的顺序调用,整个对象从派生类到基类的资源都能被正确释放。

如果Base类析构函数不是虚函数的问题

  1. 资源泄漏:当通过Base类指针删除Derived类对象时,如果Base类析构函数不是虚函数,只会调用Base类的析构函数,而不会调用Derived类的析构函数。这就导致Derived类中动态分配的资源无法被释放,从而产生资源泄漏。例如,如果Derived类中有动态分配的数组或指针指向的内存,这些内存将无法被释放,随着程序运行,会不断消耗系统内存,最终可能导致程序出现内存不足等问题。
  2. 对象清理不完整:除了资源泄漏,对象的清理也不完整。因为只调用了Base类的析构函数,Derived类的一些清理操作(如关闭文件描述符、释放数据库连接等)没有执行,可能会使程序处于不一致的状态,影响程序后续的正常运行。