面试题答案
一键面试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
对象的析构函数会被调用,释放对象中动态分配的数组内存。