码迷,mamicode.com
首页 > 其他好文 > 详细

29)深拷贝和浅拷贝

时间:2018-01-03 16:03:46      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:free   color   有一个   类成员   end   image   问题   包括   not   

1)浅拷贝,就是单单的将数值拷过去,包括你的指针指向

2)那么就有一个问题了(浅拷贝)

  

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 
 6 class Teacher{
 7 public:
 8     Teacher(int id,char *name)
 9     {
10         this->id=id;
11         int len=strlen(name);
12 
13         this->name=(char*)malloc(len+1);
14         strcpy(this->name,name);
15     }
16     Teacher(const Teacher &another)
17     {
18         this->name=another.name;
19         this->id=another.id;
20     }
21     ~Teacher()
22     {
23         cout<<"Teacher的析构函数"<<endl;
24         if(this->name!=NULL)
25         {
26             free(this->name);
27             this->name=NULL;
28         }
29         
30     }
31 private:
32     char *name;
33     int id;
34 
35 };
36 //为啥有这个函数,因为想要我实例化的对象好 析构掉,只要我调用了这个函数,之后就会把这个函数里的对象给析构掉
37 void hanshu()
38 {
39     Teacher t1(1,"王超");
40     Teacher t2=t1;
41 }
42 int main()
43 {
44     hanshu();
45 
46 //后面,那个hanshu()里的对象就被袭析构掉了
47     return 0;
48 }

    技术分享图片

  这个的关系类图是:

    技术分享图片

    然后就是那个t2 就是这样的。

    技术分享图片

     但是我调用完 hanshu()后,先析构t2    那么那块对内存被回收了

     然后,我又回收t1    那个t1的name不是空   还是调用那个free函数,但是  那块内存已经被回收了,所以就有了错误,系统就崩掉了

 

这个是浅拷贝带来的问题

然后,就有可深拷贝,来避免这个问题

需要一个显式的深构造函数,来完成深构造函数

只要你的类成员中有一个指针,就需要 提供一个手动深构造函数,来完成深拷贝动作。

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 
 6 class Teacher{
 7 public:
 8     Teacher(int id,char *name)
 9     {
10         this->id=id;
11         int len=strlen(name);
12 
13         this->name=(char*)malloc(len+1);
14         strcpy(this->name,name);
15     }
16     //新加的拷贝构造函数
17     Teacher(const Teacher &another)
18     {
19         id=another.id;
20         //深拷贝动作
21         int len=strlen(another.name);
22         name=(char*)malloc(len+1);
23     }
24 
25     ~Teacher()
26     {
27         cout<<"Teacher的析构函数"<<endl;
28         if(this->name!=NULL)
29         {
30             free(this->name);
31             this->name=NULL;
32         }
33         
34     }
35 private:
36     char *name;
37     int id;
38 
39 };
40 void hanshu()
41 {
42     Teacher t1(1,"王压抑");
43     Teacher t2=t1;
44 }
45 int main()
46 {
47     hanshu();
48     return 0;
49 }

 

 技术分享图片

然后就变成了:

  技术分享图片

 

29)深拷贝和浅拷贝

标签:free   color   有一个   类成员   end   image   问题   包括   not   

原文地址:https://www.cnblogs.com/xiaoyoucai/p/8183472.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!