C++——深拷贝和浅拷贝

1.浅拷贝与深拷贝的区别

浅拷贝(默认拷贝函数):将原对象或原数组的引用直接赋给新对象,新数组,新对象/新数组只是原对象的一个引用。

深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是引用

深拷贝会在堆内存中另外申请空间来储存数据,从而解决了指针悬挂问题。当数据成员中有指针时,必须要用深拷贝

(1)如果拷贝的对象里的元素只有值,没有引用,那么深拷贝与浅拷贝是相同的。

都会对原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象与原对象完全分离开。

(2)如果拷贝的对象里的元素包含引用(像一个列表中储存着另一个列表,存的就是另一个列表的引用),那么浅拷贝和深拷贝是不同的。

浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象与原对象并没有完全分离开。

深拷贝不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分开。

2.为什么要用深拷贝

在改变新的数组(对象)时,不会改变原数组(对象)

3.有指针时,必须用深拷贝

当数据成员中含有指针时,必须用深拷贝

当用浅拷贝时,新对象的指针与原对象的指针指向了堆上的同一块儿内存,新对象和原对象析构时,新对象先把其指向的动态分配的内存释放了一次,而后原对象析构时又将这块已经释放过的内存再释放一次。对同一块动态内存执行2次以上释放的结果是未定义的,所有会导致内存泄漏或程序崩溃。

所以需要深拷贝来解决问题,当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象开辟一块新的资源,而不再对拷贝对象中对其他资源的引用的指针或引用进行单纯的赋值。

4.构造深拷贝

class MyString
{
private:
   char *str;
public:
   MyString(const char *p=nullstr)//缺省构造函数
       :str(nullptr)
  {
     if(p!=nullptr)
    {
      int len=strlen(p)+1;
      str=new char[len];
      strcpy_s(str,lrn,p);
     }
  }
 
   MyString(const MyString& ms)//拷贝构造函数,深拷贝
  {
	 int n = strlen(ms.str) + 1;
	 *str = new char[n];
	 strcpy_s = (str, n, ms.str);
     //int *str
     // this->str=new int(*ms.str)
  }
 
   ~MyString()//析构函数
  {
  }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值