MST

星途 面试题库

面试题:C++ 动态内存分配中指针的复杂应用

假设有一个类 `MyClass`,包含一个 `int` 类型的成员变量。编写一个函数,该函数接受一个指向 `MyClass` 对象的指针数组,动态分配内存以创建一个新的 `MyClass` 对象数组,其大小为传入指针数组中有效对象(非空指针)的数量。将原指针数组中的有效对象数据复制到新创建的数组中,最后释放原指针数组中的对象(但不释放新创建的数组)。请给出完整代码实现,并阐述你在处理过程中如何避免内存泄漏。
14.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class MyClass {
private:
    int data;
public:
    MyClass(int value) : data(value) {}
    ~MyClass() {}
    int getData() const {
        return data;
    }
};

MyClass** createAndCopyArray(MyClass** ptrArray, int size) {
    int validCount = 0;
    // 统计有效对象(非空指针)的数量
    for (int i = 0; i < size; ++i) {
        if (ptrArray[i] != nullptr) {
            ++validCount;
        }
    }

    // 动态分配内存创建新的MyClass对象数组
    MyClass** newArray = new MyClass*[validCount];
    int newIndex = 0;
    // 复制有效对象数据到新数组
    for (int i = 0; i < size; ++i) {
        if (ptrArray[i] != nullptr) {
            newArray[newIndex] = new MyClass(ptrArray[i]->getData());
            ++newIndex;
        }
    }

    // 释放原指针数组中的对象
    for (int i = 0; i < size; ++i) {
        delete ptrArray[i];
    }
    delete[] ptrArray;

    return newArray;
}

int main() {
    MyClass* ptrArray[5] = {new MyClass(1), nullptr, new MyClass(3), new MyClass(4), nullptr};
    MyClass** newArray = createAndCopyArray(ptrArray, 5);

    for (int i = 0; i < 3; ++i) {
        std::cout << "New Array Element " << i << ": " << newArray[i]->getData() << std::endl;
        delete newArray[i];
    }
    delete[] newArray;

    return 0;
}

避免内存泄漏的措施

  1. 统计有效对象:在创建新数组前,先统计原指针数组中的有效对象数量,确保新数组大小合适,避免创建过多或过少的对象。
  2. 动态内存分配与释放
    • 使用 new 动态分配新数组 MyClass** newArray = new MyClass*[validCount];,并使用 delete[] 释放它,在 main 函数中,delete[] newArray;
    • 对原指针数组中的每个有效对象,使用 new 创建新对象并复制数据 newArray[newIndex] = new MyClass(ptrArray[i]->getData());,并在处理完原指针数组后,使用 delete 释放原指针数组中的对象 delete ptrArray[i];,同时使用 delete[] 释放原指针数组 delete[] ptrArray;
  3. 对象生命周期管理:确保在对象不再需要时,及时调用其析构函数。在释放原指针数组中的对象以及程序结束时,会调用 MyClass 的析构函数,正确释放对象占用的资源,避免内存泄漏。