面试题答案
一键面试#include <iostream>
class MyClass {
int data;
public:
MyClass(int d) : data(d) {}
};
int main() {
// 在堆上创建一个MyClass对象数组
MyClass *objArr = new MyClass[3]{MyClass(1), MyClass(2), MyClass(3)};
// 定义一个指针指向objArr
MyClass *ptr = objArr;
// 指针运算
ptr += 1;
// 正确释放objArr所指向的内存
delete[] objArr;
return 0;
}
- 类定义:
class MyClass
定义了一个自定义类,包含一个私有成员变量data
,并通过构造函数MyClass(int d)
初始化data
。
- 对象数组创建:
MyClass *objArr = new MyClass[3]{MyClass(1), MyClass(2), MyClass(3)};
在堆上创建了一个包含3个MyClass
对象的数组,并使用初始化列表对这3个对象进行初始化。
- 指针定义与运算:
MyClass *ptr = objArr;
定义了一个指针ptr
,并使其指向objArr
所指向的数组起始位置。ptr += 1;
使ptr
指向数组中的第二个对象。注意,这里ptr
虽然移动了,但objArr
指向的位置并未改变。
- 内存释放:
delete[] objArr;
正确释放objArr
所指向的数组内存。这里必须使用delete[]
,因为objArr
指向的是一个数组,如果使用delete objArr;
,会导致内存泄漏,因为这样只会释放objArr
指向的第一个对象的内存,而数组中其他对象的内存没有被释放。
内存泄漏风险及避免方法:
- 风险:如果使用
delete objArr;
而不是delete[] objArr;
,会造成内存泄漏。因为delete
只会调用objArr
指向对象的析构函数,而不会调用数组中其他对象的析构函数,从而导致其他对象占用的内存无法释放。 - 避免方法:始终使用
delete[]
来释放通过new[]
分配的数组内存,使用delete
来释放通过new
分配的单个对象内存,以此确保所有动态分配的内存都能被正确释放。