21xrx.com
2024-12-22 23:41:52 Sunday
登录
文章检索 我的文章 写文章
C++深度拷贝(Deep Copy)
2023-07-02 06:19:46 深夜i     --     --
C++ 深度拷贝 对象 内存 指针

C++中的拷贝(Copy)是指将一个对象的值复制到另一个对象中。在C++中,有两种不同的拷贝方式,分别是浅拷贝(Shallow Copy)和深度拷贝(Deep Copy)。

浅拷贝是一种简单的复制方法,它只是将一个对象的地址赋值给另一个对象,并没有为新对象分配新的内存空间。这意味着,当其中一个对象的值发生变化时,另一个对象的值也会跟着改变,因为它们共享同样的内存空间。

与之相反的是深度拷贝。深度拷贝会为新对象分配新的内存空间,并将原始对象的每一个值都复制到新的内存空间中。这样,新对象就拥有了独立的内存,并不会受到原对象的影响。

深度拷贝在C++中非常重要,特别是在涉及到动态内存分配的情况下。如果不进行深度拷贝,会导致内存泄漏或者不可预期的行为。

下面是一个示例,展示了如何在C++中进行深度拷贝:


class MyClass {

public:

  int x;

  int* arr;

  MyClass(const MyClass& other) {

    x = other.x;

    arr = new int[x];

    for (int i = 0; i < x; i++) {

      arr[i] = other.arr[i];

    }

  }

  MyClass(int _x, int* _arr) {

    x = _x;

    arr = new int[x];

    for (int i = 0; i < x; i++) {

      arr[i] = _arr[i];

    }

  }

  ~MyClass() {

    delete[] arr;

  }

};

int main() {

  int arr1[] = {1, 2, 3};

  MyClass obj1(3, arr1);

  MyClass obj2 = obj1; //浅拷贝

  obj2.arr[0] = 99;

  std::cout << obj1.arr[0] << std::endl; //输出99,因为obj2和obj1共享同一个arr数组内存

  MyClass obj3 = MyClass(obj1); //深度拷贝

  obj3.arr[0] = 88;

  std::cout << obj1.arr[0] << std::endl; //输出1,因为obj3和obj1拥有独立的内存

  return 0;

}

在上面的示例中,`MyClass`类有一个整数变量`x`和一个整数数组`arr`。`MyClass`类中还有一个默认的拷贝构造函数,这个构造函数的作用就是实现深度拷贝。

在主函数中,我们首先创建了一个`MyClass`类的实例`obj1`,它的数组`arr`的第一个元素是1。然后我们使用浅拷贝方式将`obj1`复制到`obj2`中,并把`obj2`的第一个元素修改为99。由于浅拷贝方式只是复制了地址,所以`obj1`和`obj2`共享同一个数组内存,所以`obj1.arr[0]`的输出结果是99。

然后我们使用深度拷贝方式将`obj1`复制到`obj3`中,并把`obj3`的第一个元素修改为88。由于深度拷贝方式会为新对象分配新的内存空间,并将原始对象的每一个值都复制到新的内存空间中,所以`obj1`和`obj3`拥有独立的数组内存,所以`obj1.arr[0]`的输出结果是1。

总结

在C++中,深度拷贝是一种比较常用的拷贝方式,特别是在涉及到动态内存分配的情况下。深度拷贝可以确保对象之间的独立性,从而避免不可预期的行为。在编写程序时,我们应该注意选择合适的拷贝方式,以确保程序的正确性和代码的可维护性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复