MST

星途 面试题库

面试题:C++中重写拷贝构造函数时对资源管理的注意事项

假设有一个自定义类`MyClass`,其内部包含一个动态分配的数组`int* data`。请编写该类的拷贝构造函数,并阐述在重写拷贝构造函数过程中,针对`data`这个动态资源管理需要注意什么,避免出现什么问题?
21.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
class MyClass {
private:
    int* data;
public:
    MyClass(int size) {
        data = new int[size];
    }
    // 拷贝构造函数
    MyClass(const MyClass& other) {
        int size = sizeof(other.data) / sizeof(other.data[0]);
        data = new int[size];
        for (int i = 0; i < size; i++) {
            data[i] = other.data[i];
        }
    }
    ~MyClass() {
        delete[] data;
    }
};

动态资源管理注意事项及避免问题

  1. 深拷贝:需要为新对象的data重新分配内存,并将源对象data中的数据逐个复制到新分配的内存中,避免浅拷贝。浅拷贝会导致新对象和原对象共享data指针,当其中一个对象销毁data时,另一个对象的data指针就会变成野指针,访问野指针会导致未定义行为。
  2. 内存分配成功检查:在新对象为data分配内存时,需要检查分配是否成功。若分配失败,new操作符会抛出异常。可以使用try - catch块捕获异常并进行适当处理,否则程序可能会因为内存分配失败而崩溃。
  3. 异常安全:在拷贝构造函数中,若内存分配或其他操作抛出异常,应确保已分配的资源能正确释放,避免资源泄漏。比如在上述代码中,如果在new int[size]之后,for循环复制数据过程中抛出异常,那么新分配的data内存就会泄漏。可以使用智能指针来增强异常安全性。