MST

星途 面试题库

面试题:C++类缺省构造函数与对象初始化及内存生命周期的关系

假设一个C++类中有成员变量是指针类型,指向动态分配的数组。阐述缺省构造函数在这种情况下对对象初始化的影响,以及由此可能引发的内存生命周期管理问题,如何避免这些问题?
49.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

缺省构造函数对对象初始化的影响

  1. 指针未初始化:C++的缺省构造函数不会自动初始化指针成员变量。这意味着指针将处于未定义状态,可能指向任意内存位置。
  2. 数组未分配:由于指针未初始化,指向的动态分配数组实际上并未创建。

可能引发的内存生命周期管理问题

  1. 悬空指针:如果在未正确初始化指针的情况下使用该对象,可能会访问到无效内存,导致程序崩溃。例如,尝试对未初始化的指针进行解引用操作 *pointerVariable
  2. 内存泄漏:如果对象在未释放指针指向的动态分配内存时被销毁,就会发生内存泄漏。因为没有机会释放该内存,这块内存将一直占用,直到程序结束。

避免这些问题的方法

  1. 自定义构造函数:在类中定义一个自定义构造函数,在其中为指针分配内存。例如:
class MyClass {
private:
    int* myArray;
public:
    MyClass(int size) {
        myArray = new int[size];
    }
};
  1. 自定义析构函数:定义一个析构函数来释放指针指向的内存。例如:
class MyClass {
private:
    int* myArray;
public:
    MyClass(int size) {
        myArray = new int[size];
    }
    ~MyClass() {
        delete[] myArray;
    }
};
  1. 使用智能指针:使用 std::unique_ptrstd::shared_ptr 代替原始指针,它们会自动管理内存的释放。例如:
#include <memory>
class MyClass {
private:
    std::unique_ptr<int[]> myArray;
public:
    MyClass(int size) : myArray(std::make_unique<int[]>(size)) {}
};

这样,当 MyClass 对象销毁时,std::unique_ptr 会自动释放其管理的动态分配数组的内存。如果使用 std::shared_ptr,它会在引用计数为0时释放内存。