面试题答案
一键面试缺省构造函数对对象初始化的影响
- 指针未初始化:C++的缺省构造函数不会自动初始化指针成员变量。这意味着指针将处于未定义状态,可能指向任意内存位置。
- 数组未分配:由于指针未初始化,指向的动态分配数组实际上并未创建。
可能引发的内存生命周期管理问题
- 悬空指针:如果在未正确初始化指针的情况下使用该对象,可能会访问到无效内存,导致程序崩溃。例如,尝试对未初始化的指针进行解引用操作
*pointerVariable
。 - 内存泄漏:如果对象在未释放指针指向的动态分配内存时被销毁,就会发生内存泄漏。因为没有机会释放该内存,这块内存将一直占用,直到程序结束。
避免这些问题的方法
- 自定义构造函数:在类中定义一个自定义构造函数,在其中为指针分配内存。例如:
class MyClass {
private:
int* myArray;
public:
MyClass(int size) {
myArray = new int[size];
}
};
- 自定义析构函数:定义一个析构函数来释放指针指向的内存。例如:
class MyClass {
private:
int* myArray;
public:
MyClass(int size) {
myArray = new int[size];
}
~MyClass() {
delete[] myArray;
}
};
- 使用智能指针:使用
std::unique_ptr
或std::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时释放内存。