MST

星途 面试题库

面试题:C++ 中析构函数如何释放动态分配的内存资源

请举例说明在 C++ 中,当一个类动态分配了内存(例如使用 new 操作符分配数组),析构函数如何正确地释放这部分内存,以避免内存泄漏。并解释析构函数调用的时机。
36.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 示例代码展示内存释放

假设我们有一个类 MyArray,它在构造函数中动态分配一个整数数组:

#include <iostream>

class MyArray {
private:
    int* arr;
    int size;
public:
    MyArray(int s) : size(s) {
        arr = new int[size];
        for (int i = 0; i < size; ++i) {
            arr[i] = i;
        }
    }
    ~MyArray() {
        delete[] arr;
    }
    void printArray() {
        for (int i = 0; i < size; ++i) {
            std::cout << arr[i] << " ";
        }
        std::cout << std::endl;
    }
};

在上述代码中,MyArray 类在构造函数中使用 new int[size] 分配了一个整数数组 arr。析构函数中使用 delete[] arr 来释放这部分动态分配的内存。这样就避免了内存泄漏。

2. 析构函数调用的时机

  • 对象生命周期结束时:当一个局部对象(例如在函数内部定义的对象)超出其作用域时,析构函数会被自动调用。例如:
void someFunction() {
    MyArray a(5);
    a.printArray();
}

someFunction 函数结束时,对象 a 的生命周期结束,a 的析构函数会被自动调用,从而释放 a 中动态分配的数组内存。

  • 使用 delete 操作符时:如果通过 new 操作符动态创建了一个对象(使用 new 创建对象指针),当使用 delete 操作符删除该指针时,析构函数会被调用。例如:
int main() {
    MyArray* ptr = new MyArray(3);
    ptr->printArray();
    delete ptr;
    return 0;
}

这里,当执行 delete ptr 时,MyArray 对象的析构函数会被调用,释放对象中动态分配的数组内存。