21xrx.com
2024-11-05 14:51:01 Tuesday
登录
文章检索 我的文章 写文章
C++如何实现深拷贝?
2023-07-11 13:50:24 深夜i     --     --
C++ 实现 深拷贝

在C++中,有时候我们需要对对象进行拷贝操作,以便进行数据的复制或传递。而在进行拷贝操作时,有时候会出现浅拷贝的情况,这会导致在销毁拷贝对象时,可能会出现多次释放同一内存地址的问题。为了解决这个问题,我们需要使用深拷贝。

深拷贝与浅拷贝的区别在于,深拷贝会对被拷贝对象的所有内容进行复制,包括指针指向的内容,而浅拷贝只会复制指针本身的值。下面是一个示例代码,展示了浅拷贝和深拷贝的区别:


#include <iostream>

#include <cstring>

class Person {

public:

  char* name;

  

  Person(char* n) {

    name = new char[strlen(n) + 1];

    strcpy(name, n);

  }

  

  Person(const Person& p) {

    //浅拷贝

    name = p.name;

    

    //深拷贝

    //name = new char[strlen(p.name) + 1];

    //strcpy(name, p.name);

  }

  

  ~Person() {

    delete[] name;

  }

};

int main() {

  char n[] = "John";

  Person p1(n);

  Person p2(p1);

  

  std::cout << "p1.name: " << p1.name << std::endl;

  std::cout << "p2.name: " << p2.name << std::endl;

  

  delete[] n;

  return 0;

}

上面的代码包含了一个`Person`类,这个类有一个指向字符串的指针`char* name`,并且包含了一个构造函数和一个拷贝构造函数。在主函数里,我们创建了两个`Person`对象`p1`和`p2`,并将`p1`拷贝给了`p2`,然后输出了它们的`name`成员。需要注意的是,这里我们使用了`new`关键字来动态分配一个字符数组,然后在析构函数里使用`delete[]`释放内存。

接下来,我们注释掉了`Person`类拷贝构造函数中的浅拷贝实现,启用了深拷贝的实现。现在再运行这个程序,你会发现输出结果如下:


p1.name: John

p2.name: John

这是因为当使用浅拷贝时,`p2.name`只是指向了`p1.name`指向的内存地址,而并没有将`p1.name`指向的字符串内容复制过来,所以在输出时它们的值是相同的。而当使用深拷贝时,`p2`对象会分配一个新的内存地址,并将`p1.name`指向的字符串内容复制过去,这样它们的值就不再相同了。

在进行深拷贝时,我们需要动态分配一块新的内存空间,然后将源对象的内容复制到这个空间。这里我们使用了`new`关键字来动态分配内存,然后使用`strcpy`函数将字符串内容复制过去。需要注意的是,当使用深拷贝时,也要在析构函数里使用`delete[]`来释放内存,否则会出现内存泄漏的问题。

总之,在实现C++深拷贝时,我们需要注意以下几点:

- 在构造函数中动态分配内存空间

- 在拷贝构造函数中对所有内容进行复制

- 在析构函数中释放动态分配的内存空间

当我们使用深拷贝时,可以避免出现多次释放同一内存地址的问题,从而提高程序的稳定性和可靠性。

  
  

评论区

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