面试题答案
一键面试假设MyClass
类定义如下:
class MyClass {
private:
int* data;
public:
MyClass(int size) {
data = new int[size];
}
~MyClass() {
delete[] data;
}
};
- 释放单个
MyClass
对象
MyClass* obj = new MyClass(5);
// 使用obj
delete obj;
原因:delete obj
用于释放通过new
分配的单个MyClass
对象。当delete
一个对象时,会自动调用该对象的析构函数,在MyClass
的析构函数中,已经正确释放了data
数组的内存,所以这里直接使用delete
释放MyClass
对象本身即可。
- 释放
MyClass
类型的动态数组
MyClass* arr = new MyClass[3];
// 使用arr
delete[] arr;
原因:delete[] arr
用于释放通过new[]
分配的MyClass
对象数组。当使用delete[]
时,会按顺序调用数组中每个对象的析构函数,从而正确释放每个对象内部动态分配的内存(如data
数组)。如果使用delete
而不是delete[]
来释放数组,只会调用数组第一个元素的析构函数,其他元素的析构函数不会被调用,导致内存泄漏。