[C/C++] 深拷贝和浅拷贝

·默认拷贝构造函数可以完成对象的数据成员值简单地复制-----浅拷贝

·对象的数据资源是由指针指示的堆时,默认拷贝构造函数仅作指针值的复制,需要显式定义拷贝构造函数-----深拷贝

首先定义几个点:

Point p1("home",1.0,2.0),p2("school",3.0),p3;

[C/C++] 深拷贝和浅拷贝

Point p1("home",1.0,2.0),p2("school",3.0),p3;
Point p4 = p1;

浅拷贝:

[C/C++] 深拷贝和浅拷贝

深拷贝:

[C/C++] 深拷贝和浅拷贝

自定义的拷贝构造函数:

1 Point::Point(Point &p):x(p.x),y(p.y)
 2 {
 3     if(p.name)
 4     {
 5         name=new char[strlen(p.name)+1];
 6         strcpy(name,p.name);
 7     }
 8     else
 9     {
10         name=new char[8];
11         strcpy(name,"no name");
12     }
13     cout<<name<<"  copy constructing”;
14     }

注:若是浅拷贝,当p1先执行析构函数之后,name所指向的内存被释放掉;当p4再执行析构函数的时候,由于p1和p4中的name指向的是同一块地址空间,因此会因为对同一块地址释放两次内存而报错。但深拷贝就没有这个风险。

标记拷贝构造

对于深拷贝,需要把资源复制一份,而有时候资源很大,复制需要大量的时间和空间,甚至有些资源是不可复制的,这时深拷贝是不可取的,为此,可以选择带标记的拷贝构造。

原理:通过一个标志位flag来确定当前对象是拷贝生成的还是构造生成的;在析构函数中对拷贝生成的对象不释放额外资源,原始生成的对象析构时才能释放额外资源,从而解决了同一个资源空间被释放多次的问题。
原文链接: https://www.cnblogs.com/lca1826/p/6505964.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/250283

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午4:23
下一篇 2023年2月14日 上午4:23

相关推荐