面试题答案
一键面试缺省析构函数在对象生命周期结束时的操作
- 栈上成员变量:
- 对于在类中定义的栈上成员变量(例如基本数据类型、其他类对象等),缺省析构函数会按成员变量声明的逆序调用它们各自的析构函数(如果有)。例如,如果类中有一个
int
类型成员变量a
和一个自定义类MyClass
的对象成员obj
,当对象生命周期结束,先调用obj
的析构函数(如果MyClass
定义了析构函数),然后释放a
占用的空间(int
类型不需要显式释放空间)。
- 对于在类中定义的栈上成员变量(例如基本数据类型、其他类对象等),缺省析构函数会按成员变量声明的逆序调用它们各自的析构函数(如果有)。例如,如果类中有一个
- 释放对象占用的内存:
- 缺省析构函数会释放对象本身占用的内存空间。例如,当在栈上定义一个类对象
MyClass obj;
,当obj
生命周期结束,缺省析构函数会释放obj
在栈上占用的空间;如果是在堆上通过new
创建的对象MyClass* ptr = new MyClass();
,当delete ptr;
执行时,缺省析构函数会释放ptr
指向的堆内存空间(对象本身占用的部分)。
- 缺省析构函数会释放对象本身占用的内存空间。例如,当在栈上定义一个类对象
当类中包含动态分配的资源时需要自定义析构函数的原因
- 内存泄漏问题:
- 缺省析构函数不会自动释放通过
new
、malloc
等动态分配的资源。例如,类中定义了一个指针成员int* data = new int[10];
,缺省析构函数不会执行delete[] data;
,这就导致这部分动态分配的内存无法释放,造成内存泄漏。随着程序的运行,不断地动态分配内存而不释放,最终会耗尽系统内存资源。
- 缺省析构函数不会自动释放通过
- 资源管理问题:
- 除了内存资源,像文件句柄、网络连接等其他动态分配的资源,缺省析构函数也不会进行适当的清理。例如,如果类在构造函数中打开了一个文件
file.open("test.txt");
,缺省析构函数不会关闭这个文件,可能导致文件描述符泄漏,影响系统对文件资源的管理。因此,为了正确释放这些动态分配的资源,需要自定义析构函数,在析构函数中编写代码来释放内存、关闭文件、断开网络连接等操作。
- 除了内存资源,像文件句柄、网络连接等其他动态分配的资源,缺省析构函数也不会进行适当的清理。例如,如果类在构造函数中打开了一个文件