MST

星途 面试题库

面试题:C++ 中浅拷贝与深拷贝在拷贝构造函数中的区别及示例

请解释 C++ 拷贝构造函数中浅拷贝和深拷贝的概念,并分别给出一个简单的代码示例,说明浅拷贝可能引发的问题。
32.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

浅拷贝和深拷贝概念

  1. 浅拷贝
    • 浅拷贝是指在拷贝对象时,只复制对象中的基本数据类型成员变量的值,而对于指针类型的成员变量,只是简单地复制指针的值(即内存地址),而不是复制指针所指向的内存空间中的数据。这就导致多个对象的指针成员指向同一块内存空间。
  2. 深拷贝
    • 深拷贝不仅复制对象中的基本数据类型成员变量的值,对于指针类型的成员变量,会重新分配一块新的内存空间,并将原指针所指向的内存空间中的数据复制到新分配的内存空间中。这样每个对象都有自己独立的内存空间,相互之间不会影响。

代码示例

  1. 浅拷贝示例
#include <iostream>
using namespace std;

class ShallowCopy {
public:
    int *data;
    ShallowCopy(int value) {
        data = new int(value);
    }
    // 浅拷贝构造函数(默认的拷贝构造函数就是浅拷贝)
    ShallowCopy(const ShallowCopy& other) {
        data = other.data;
    }
    ~ShallowCopy() {
        delete data;
    }
};

int main() {
    ShallowCopy obj1(10);
    ShallowCopy obj2(obj1);
    cout << "obj1 data: " << *obj1.data << endl;
    cout << "obj2 data: " << *obj2.data << endl;
    // 修改obj1的数据
    *obj1.data = 20;
    cout << "After modifying obj1, obj2 data: " << *obj2.data << endl;
    return 0;
}
  1. 深拷贝示例
#include <iostream>
using namespace std;

class DeepCopy {
public:
    int *data;
    DeepCopy(int value) {
        data = new int(value);
    }
    // 深拷贝构造函数
    DeepCopy(const DeepCopy& other) {
        data = new int(*other.data);
    }
    ~DeepCopy() {
        delete data;
    }
};

int main() {
    DeepCopy obj1(10);
    DeepCopy obj2(obj1);
    cout << "obj1 data: " << *obj1.data << endl;
    cout << "obj2 data: " << *obj2.data << endl;
    // 修改obj1的数据
    *obj1.data = 20;
    cout << "After modifying obj1, obj2 data: " << *obj2.data << endl;
    return 0;
}

浅拷贝可能引发的问题

  1. 内存释放问题
    • 在上述浅拷贝示例中,obj1obj2data指针指向同一块内存。当obj1obj2先后析构时,会对同一块内存进行两次delete操作,这会导致程序崩溃。因为一旦obj1析构释放了内存,obj2data指针就成为了野指针,再次释放会引发未定义行为。
  2. 数据一致性问题
    • 由于obj1obj2data指针指向同一块内存,修改obj1的数据会影响obj2的数据,如上述示例中修改obj1的数据后,obj2的数据也跟着改变,这可能不符合程序的预期逻辑。