当前位置:首页 C++ > 正文

C++深拷贝和浅拷贝的区别

作者:野牛程序员:2023-07-21 08:30:20 C++阅读 2763

在 C++ 中,深拷贝(deep copy)和浅拷贝(shallow copy)是两种不同的对象拷贝方式。它们的主要区别在于拷贝时是否复制对象所指向的动态内存(堆内存)内容。

  1. 浅拷贝(Shallow Copy): 浅拷贝是指将一个对象的值复制到另一个对象,包括其中的成员变量。如果对象中有指向动态内存的指针或者引用,浅拷贝只会复制指针或引用的值,而不会复制指针所指向的实际数据。这意味着原对象和拷贝对象将共享同一块内存,从而可能导致两个对象在析构时尝试释放同一块内存,导致错误(悬挂指针)或内存泄漏。

示例代码:

#include <iostream>

class ShallowCopy {
public:
    int* data;

    ShallowCopy() {
        data = new int[1];
        *data = 0;
    }

    // 拷贝构造函数 - 浅拷贝
    ShallowCopy(const ShallowCopy& other) {
        data = other.data; // 仅复制指针值,而不复制数据
    }

    ~ShallowCopy() {
        delete[] data;
    }
};

int main() {
    ShallowCopy obj1;
    obj1.data[0] = 42;

    ShallowCopy obj2 = obj1; // 浅拷贝,obj1 和 obj2 共享同一块内存

    std::cout << *obj1.data << std::endl; // 输出 42
    std::cout << *obj2.data << std::endl; // 输出 42

    obj2.data[0] = 99;

    std::cout << *obj1.data << std::endl; // 输出 99,因为 obj1 和 obj2 共享同一块内存

    return 0;
}
  1. 深拷贝(Deep Copy): 深拷贝是指在拷贝对象时,会复制对象所指向的动态内存中的内容,而不是简单地复制指针或引用。这样,在拷贝对象后,原对象和拷贝对象将有各自独立的内存空间,彼此不会相互影响。

示例代码:

#include <iostream>

class DeepCopy {
public:
    int* data;

    DeepCopy() {
        data = new int[1];
        *data = 0;
    }

    // 拷贝构造函数 - 深拷贝
    DeepCopy(const DeepCopy& other) {
        data = new int[1]; // 创建新的内存空间
        *data = *other.data; // 复制数据
    }

    ~DeepCopy() {
        delete[] data;
    }
};

int main() {
    DeepCopy obj1;
    obj1.data[0] = 42;

    DeepCopy obj2 = obj1; // 深拷贝,obj1 和 obj2 有独立的内存空间

    std::cout << *obj1.data << std::endl; // 输出 42
    std::cout << *obj2.data << std::endl; // 输出 42

    obj2.data[0] = 99;

    std::cout << *obj1.data << std::endl; // 输出 42,因为 obj1 和 obj2 有独立的内存空间

    return 0;
}

总结:

  • 浅拷贝只复制指针或引用的值,而不复制指针指向的数据,导致多个对象共享同一块内存,可能带来错误和内存管理问题。

  • 深拷贝复制指针指向的数据,创建独立的内存空间,避免对象之间的数据干扰,但可能导致额外的内存开销。

在实现自定义的类时,特别是当类中包含指针成员时,确保正确地处理拷贝构造函数和析构函数是非常重要的,以避免内存管理问题。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击