MST

星途 面试题库

面试题:C++中不调用父类析构的隐患分析

在C++中,若子类析构函数不调用父类析构函数,可能会产生哪些内存相关的后果?请举例说明,假设父类中有动态分配的内存。
46.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 内存泄漏
    • 当父类中有动态分配的内存时,如果子类析构函数不调用父类析构函数,父类中动态分配的内存将无法被释放。因为父类中负责释放动态内存的代码在父类析构函数中,不调用父类析构函数,这块内存就一直处于占用状态,从而导致内存泄漏。
    • 示例代码如下:
#include <iostream>
class Parent {
public:
    Parent() {
        data = new int[10];
        std::cout << "Parent constructor: Memory allocated for data\n";
    }
    ~Parent() {
        delete[] data;
        std::cout << "Parent destructor: Memory deallocated for data\n";
    }
private:
    int* data;
};
class Child : public Parent {
public:
    ~Child() {
        // 没有调用父类析构函数,会导致内存泄漏
        std::cout << "Child destructor\n";
    }
};
int main() {
    Child* childObj = new Child();
    delete childObj;
    return 0;
}

在上述代码中,Child类的析构函数没有调用Parent类的析构函数,Parent类中动态分配的int数组data所占用的内存无法释放,造成内存泄漏。运行程序时,只会看到“Child destructor”输出,而不会看到“Parent destructor: Memory deallocated for data”输出。

  1. 资源未正确清理:除了内存泄漏外,父类中可能还管理其他资源(如文件句柄、网络连接等),如果子类析构函数不调用父类析构函数,这些资源也无法得到正确清理,可能导致资源占用和系统资源耗尽等问题。虽然示例中以内存为例,但原理同样适用于其他资源类型。