MST

星途 面试题库

面试题:C++指针运算与内存管理的结合

已知有一个自定义类`class MyClass { int data; public: MyClass(int d) : data(d) {} };`,在堆上创建一个`MyClass`对象数组`MyClass *objArr = new MyClass[3]{MyClass(1), MyClass(2), MyClass(3)};`。定义一个指针`MyClass *ptr = objArr;`,对`ptr`进行一些运算,如`ptr += 1;`,最后要正确释放`objArr`所指向的内存,应该如何操作?请写出完整代码,并解释每一步的作用,同时说明在这个过程中可能会出现的内存泄漏风险及如何避免。
12.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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;
}
  1. 类定义
    • class MyClass定义了一个自定义类,包含一个私有成员变量data,并通过构造函数MyClass(int d)初始化data
  2. 对象数组创建
    • MyClass *objArr = new MyClass[3]{MyClass(1), MyClass(2), MyClass(3)};在堆上创建了一个包含3个MyClass对象的数组,并使用初始化列表对这3个对象进行初始化。
  3. 指针定义与运算
    • MyClass *ptr = objArr;定义了一个指针ptr,并使其指向objArr所指向的数组起始位置。
    • ptr += 1;使ptr指向数组中的第二个对象。注意,这里ptr虽然移动了,但objArr指向的位置并未改变。
  4. 内存释放
    • delete[] objArr;正确释放objArr所指向的数组内存。这里必须使用delete[],因为objArr指向的是一个数组,如果使用delete objArr;,会导致内存泄漏,因为这样只会释放objArr指向的第一个对象的内存,而数组中其他对象的内存没有被释放。

内存泄漏风险及避免方法

  • 风险:如果使用delete objArr;而不是delete[] objArr;,会造成内存泄漏。因为delete只会调用objArr指向对象的析构函数,而不会调用数组中其他对象的析构函数,从而导致其他对象占用的内存无法释放。
  • 避免方法:始终使用delete[]来释放通过new[]分配的数组内存,使用delete来释放通过new分配的单个对象内存,以此确保所有动态分配的内存都能被正确释放。