深复制和浅复制讨论

博客介绍了复制构造函数发生的三种情况,阐述其作用是复制非静态数据成员。指出浅复制会让新旧对象指向同一外部内存,导致析构时重复释放内存使程序崩溃,还提及深复制概念,即让新旧对象指向不同外部内存,并表示会给出解决问题的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复制构造函数发生的三种情况:

   1、一个类对象通过另外一个对象进行初始化时;

   2、一个类对象以值传递的方式传入函数体中时;

   3、一个类对象以值传递的方式从函数返回时;

————————————————————————————————————————————————————————————

复制构造函数的作用:依次复制每个非静态数据成员来给类对象,叫做复制构造过程。

View Code
 1 #include <iostream>
2 #include <string>
3 using namespace std;
4 class Test
5 {
6 public:
7 char *buf;
8 Test(void)
9 { buf = NULL; }
10 Test(const char * str)
11 {
12 buf = new char[strlen(str) + 1];
13 strcpy_s(buf,strlen(str)+1,str); // vs2008版本
14 }
15 ~Test()
16 { delete buf; buf = NULL; }
17 };
18 void main()
19 {
20 Test t1("Hello");
21 Test t2 = t1;
22 cout << "t1.buf == t2.buf" << (t1.buf == t2.buf?"yes":"no") << endl;
23 }

 

输出:

   t1.buf == t2.buf yes

   程序崩溃

在Test的析构函数中设置一个断点,调试可以看出:在t2的析构时,程序崩溃。

原因分析:Test t2 = t1; // 调用Test的复制构造函数,显然会调用默认复制构造函数。从而把t1的buf 成员地址给t2的buf成员。

                                 // 在析构时,两次释放了同一块内存,所以出现了出现崩溃。

这种让新旧两个对象指向同一个外部内存的现象,叫做浅复制;

那么,自然当在复制构造时,让新旧对象指向不同的外部内存的现象,就叫做深复制了;

————————————————————————————————————————————————————————————————————

现在,问题了解清楚了。那么,怎么解决上面的问题了?

直接上代码:

View Code
 1 #include <iostream>
2 #include <string>
3 using namespace std;
4 class Test
5 {
6 public:
7 char *buf;
8 Test(void)
9 {
10 buf = NULL;
11 }
12 Test(Test &t) //增加一个自定义的复制构造函数,手动申请一块内存解决这个问题
13 {
14 buf = new char[strlen(t.buf)+1];
15 strcpy_s(buf,strlen(t.buf)+1,t.buf);
16 }
17 Test(const char * str)
18 {
19 buf = new char[strlen(str) + 1];
20 strcpy_s(buf,strlen(str)+1,str); // vs2008版本
21 }
22 ~Test()
23 {
24 delete buf;
25 buf = NULL;
26 }
27 };
28 void main()
29 {
30 Test t1("Hello");
31 Test t2 = t1;
32
33 cout << "t1.buf == t2.buf" <<
34 (t1.buf == t2.buf?"yes":"no") << endl;
35
36 }

输出:

  t1.buf == t2.buf yes

转载于:https://www.cnblogs.com/xuxu8511/archive/2012/03/19/2406207.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值