MST

星途 面试题库

面试题:C++ 析构函数重载与资源回收基础

在C++中,简述析构函数重载的概念以及它在资源回收方面的作用。如果一个类中有多个析构函数重载,编译器如何选择合适的析构函数?举例说明在不同资源类型(如动态分配的内存、文件句柄)下,析构函数如何进行资源回收。
21.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

析构函数重载概念

  • 在C++中,析构函数不能被重载。析构函数是类的特殊成员函数,其名称与类名相同,但前面加“~”符号,且没有参数和返回值。每个类只能有一个析构函数,如果定义多个会导致编译错误。

析构函数在资源回收方面的作用

  • 自动资源管理:当对象生命周期结束时,无论是正常结束(如局部对象离开作用域)还是异常结束,析构函数会自动被调用,从而释放对象所占用的资源,防止内存泄漏等问题。
  • 资源清理:对于动态分配的资源(如通过new分配的内存)、打开的文件句柄、网络连接等,析构函数提供了一个地方来进行资源的释放和清理操作,确保资源在对象销毁时能被正确处理。

不同资源类型下析构函数资源回收举例

  1. 动态分配的内存
class MemoryHolder {
public:
    MemoryHolder() {
        data = new int[10];
    }
    ~MemoryHolder() {
        delete[] data;
    }
private:
    int* data;
};

在上述代码中,MemoryHolder类的构造函数使用new[]分配了一个包含10个int的数组,析构函数使用delete[]来释放这块动态分配的内存。

  1. 文件句柄
#include <fstream>
class FileHandler {
public:
    FileHandler(const char* filename) {
        file.open(filename, std::ios::out);
    }
    ~FileHandler() {
        if (file.is_open()) {
            file.close();
        }
    }
private:
    std::ofstream file;
};

这里FileHandler类的构造函数打开一个文件用于输出,析构函数检查文件是否打开,如果打开则关闭文件句柄,从而释放系统资源。