MST

星途 面试题库

面试题:C++类缺省函数中析构函数在对象生命周期管理中的作用

在C++类中,简述缺省析构函数在对象生命周期结束时所执行的操作,以及当类中包含动态分配的资源时,为何需要自定义析构函数而不能依赖缺省析构函数?
49.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

缺省析构函数在对象生命周期结束时的操作

  1. 栈上成员变量
    • 对于在类中定义的栈上成员变量(例如基本数据类型、其他类对象等),缺省析构函数会按成员变量声明的逆序调用它们各自的析构函数(如果有)。例如,如果类中有一个 int 类型成员变量 a 和一个自定义类 MyClass 的对象成员 obj,当对象生命周期结束,先调用 obj 的析构函数(如果 MyClass 定义了析构函数),然后释放 a 占用的空间(int 类型不需要显式释放空间)。
  2. 释放对象占用的内存
    • 缺省析构函数会释放对象本身占用的内存空间。例如,当在栈上定义一个类对象 MyClass obj;,当 obj 生命周期结束,缺省析构函数会释放 obj 在栈上占用的空间;如果是在堆上通过 new 创建的对象 MyClass* ptr = new MyClass();,当 delete ptr; 执行时,缺省析构函数会释放 ptr 指向的堆内存空间(对象本身占用的部分)。

当类中包含动态分配的资源时需要自定义析构函数的原因

  1. 内存泄漏问题
    • 缺省析构函数不会自动释放通过 newmalloc 等动态分配的资源。例如,类中定义了一个指针成员 int* data = new int[10];,缺省析构函数不会执行 delete[] data;,这就导致这部分动态分配的内存无法释放,造成内存泄漏。随着程序的运行,不断地动态分配内存而不释放,最终会耗尽系统内存资源。
  2. 资源管理问题
    • 除了内存资源,像文件句柄、网络连接等其他动态分配的资源,缺省析构函数也不会进行适当的清理。例如,如果类在构造函数中打开了一个文件 file.open("test.txt");,缺省析构函数不会关闭这个文件,可能导致文件描述符泄漏,影响系统对文件资源的管理。因此,为了正确释放这些动态分配的资源,需要自定义析构函数,在析构函数中编写代码来释放内存、关闭文件、断开网络连接等操作。