面试题答案
一键面试当Base类析构函数为虚函数时资源释放过程
- 调用Derived类析构函数:当通过Base类指针删除Derived类对象,由于Base类析构函数是虚函数,根据多态性,会首先调用Derived类的析构函数。在Derived类析构函数中,会清理Derived类自己新增的成员变量所占用的资源(如果有动态分配的内存等资源)。
- 调用Base类析构函数:在Derived类析构函数执行完毕后,会自动调用Base类的析构函数。Base类析构函数会释放Base类中动态分配的资源(如动态分配的内存)。通过这样的顺序调用,整个对象从派生类到基类的资源都能被正确释放。
如果Base类析构函数不是虚函数的问题
- 资源泄漏:当通过Base类指针删除Derived类对象时,如果Base类析构函数不是虚函数,只会调用Base类的析构函数,而不会调用Derived类的析构函数。这就导致Derived类中动态分配的资源无法被释放,从而产生资源泄漏。例如,如果Derived类中有动态分配的数组或指针指向的内存,这些内存将无法被释放,随着程序运行,会不断消耗系统内存,最终可能导致程序出现内存不足等问题。
- 对象清理不完整:除了资源泄漏,对象的清理也不完整。因为只调用了Base类的析构函数,Derived类的一些清理操作(如关闭文件描述符、释放数据库连接等)没有执行,可能会使程序处于不一致的状态,影响程序后续的正常运行。