MST

星途 面试题库

面试题:C++ 自定义类型下 delete 与 delete[] 的内存管理分析

定义一个包含动态分配内存成员变量的类 `MyClass`,如下: ```cpp class MyClass { public: MyClass() { data = new int[5]; } ~MyClass() { delete[] data; } private: int* data; }; ``` 现在有 `MyClass* objArray = new MyClass[3];`,如果使用 `delete objArray;` 而不是 `delete[] objArray;`,会出现什么问题?详细说明内存泄漏或其他潜在错误的原理。
48.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 问题现象
    • 使用 delete objArray; 而不是 delete[] objArray; 会导致内存泄漏。
  2. 原理说明
    • 当执行 MyClass* objArray = new MyClass[3]; 时,系统为 objArray 分配了足够存储 3MyClass 对象的内存空间。同时,每个 MyClass 对象在构造函数中又为 data 成员变量动态分配了内存(data = new int[5];)。
    • 正确的释放方式是 delete[] objArray;,这样会依次调用 objArray 中每个 MyClass 对象的析构函数。在析构函数中,delete[] data; 会释放每个 MyClass 对象中 data 成员变量所指向的动态分配的内存。
    • 然而,如果使用 delete objArray;,只会调用 objArray 指向的第一个 MyClass 对象的析构函数,释放第一个 MyClass 对象中 data 所指向的内存。而剩下的两个 MyClass 对象中的 data 所指向的内存没有被释放,从而导致内存泄漏。因为这两个 MyClass 对象没有调用析构函数,它们的 data 成员变量指向的动态分配的内存就无法被回收,一直占用系统内存。