c++深拷贝和浅拷贝区别(sysu保研机考,实习面试常见问题!)

发布于:2024-08-15 ⋅ 阅读:(113) ⋅ 点赞:(0)
  • 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是C++中两个不同的对象复制方式,它们的区别在于它们如何处理对象内部的指针或动态分配的内存。

浅拷贝(Shallow Copy)

浅拷贝是指对象在复制时,只复制对象的基本数据类型成员,并对指针成员进行指针的值复制(即复制指针的地址)。换句话说,浅拷贝会将源对象和目标对象的指针成员指向同一块内存区域。这种复制方式在处理动态分配内存的成员时可能会导致问题。

示例:


class Example {
public:
    int* data;

    Example(int value) {
        data = new int(value);
    }

    // 浅拷贝构造函数
    Example(const Example& other) {
        data = other.data; // 仅复制指针,不复制指针指向的数据
    }

    ~Example() {
        delete data;
    }
};

在上面的例子中,如果使用浅拷贝构造函数创建一个新对象,那么两个对象的data成员将指向同一块内存。这样,当其中一个对象的析构函数被调用时,会释放掉data指向的内存,导致另一个对象的data变成悬空指针(dangling pointer),进而可能引发未定义行为。

深拷贝(Deep Copy)

深拷贝是指对象在复制时,不仅复制对象的基本数据类型成员,还会为指针成员分配新的内存,并复制指针指向的内容。这样,源对象和目标对象的指针成员指向的是不同的内存区域。

示例:


class Example {
public:
    int* data;

    Example(int value) {
        data = new int(value);
    }

    // 深拷贝构造函数
    Example(const Example& other) {
        data = new int(*other.data); // 分配新内存,并复制指针指向的内容
    }

    ~Example() {
        delete data;
    }
};

在这个例子中,深拷贝构造函数会为新对象的data成员分配一块新的内存,并将源对象data指向的值复制到新对象中。这样,两个对象的data成员指向不同的内存区域,彼此独立管理,避免了悬空指针的问题。

总结

浅拷贝:仅复制指针值(地址),源对象和目标对象共享相同的内存,易引发悬空指针问题。
深拷贝:复制指针指向的数据,为目标对象分配新的内存,确保源对象和目标对象独立。
在处理动态分配内存的对象时,深拷贝通常是更安全的选择。