专业编程基础技术教程

网站首页 > 基础教程 正文

C++ shallow or deep copy 浅拷贝和深拷贝

ccvgpt 2024-10-12 13:51:02 基础教程 9 ℃



C++ shallow or deep copy 浅拷贝和深拷贝

01


引言

在C++中,拷贝构造函数和赋值操作符可以用于创建对象的副本,这些副本的创建方式可以是浅拷贝(shallow copy)或深拷贝(deep copy)。理解这两者之间的区别对于正确地管理资源和避免潜在的错误至关重要。


02


浅拷贝 Shallow Copy

浅拷贝是指在创建对象的副本时,仅仅复制了原始对象中成员变量的值。如果对象中包含指针或动态分配的资源,浅拷贝只是复制了这些指针的值,而不是它们指向的资源。因此,原始对象和副本对象会共享相同的资源,指向同一片内存。

class ShallowCopyExample {
public:
    int* data;
    ShallowCopyExample(int size) {
        data = new int[size];
    }
    // 拷贝构造函数
    ShallowCopyExample(const ShallowCopyExample& other) {
        data = other.data; // 仅复制指针,不复制数据
    }
    // 析构函数
    ~ShallowCopyExample() {
        delete[] data;
    }
};

在这个例子中,拷贝构造函数执行了浅拷贝,因为它只是复制了data指针,而不是指针指向的整组数据。


03


深拷贝 Deep Copy

深拷贝是指在创建对象的副本时,不仅复制了原始对象的成员变量,还复制了这些成员变量指向的资源。如果对象包含指针或动态分配的资源,深拷贝会为副本分配新的资源,并复制原始资源的内容。

class DeepCopyExample {
public:
    int* data;
    size_t size;
    DeepCopyExample(size_t sz) : size(sz) {
        data = new int[sz];
    }
    // 拷贝构造函数
    DeepCopyExample(const DeepCopyExample& other) {
        size = other.size;
        data = new int[size];
        std::copy(other.data, other.data + size, data); // 复制数据
    }
    // 析构函数
    ~DeepCopyExample() {
        delete[] data;
    }
};

在这个例子中,拷贝构造函数执行了深拷贝,因为它为副本分配了新的内存,并复制了原始对象data指针指向的所有数据。


04


小结

  • 浅拷贝通常用于那些不拥有资源或资源可以共享的对象。
  • 深拷贝通常用于对象拥有资源,并且每个副本都应该拥有独立的资源副本。
  • 默认情况下,C++的复制构造函数和赋值操作符会执行浅拷贝,特别是当类包含指针或动态分配的资源时。这意味着,如果类中包含指针成员,复制构造函数会复制这些指针的值,而不是它们指向的资源。这可能导致原始对象和副本对象共享相同的资源,从而引发潜在的资源管理问题。
  • 在实现拷贝构造函数和赋值操作符时,开发者根据对象的资源管理需求来决定使用浅拷贝还是深拷贝。如果不正确地管理这些资源,可能会导致内存泄漏、悬挂指针或其他资源管理错误。C++也提供了std::move可以帮助实现移动语义,这是介于浅拷贝和深拷贝之间的一种资源转移方式。

最近发表
标签列表