zoukankan      html  css  js  c++  java
  • 29)深拷贝和浅拷贝

    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);
          strcpy(name,another.name);
    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 }

     

    然后就变成了:

      

  • 相关阅读:
    Please verify that your alternate settings file is specified properly and exists in the workspace.
    史上最全最新微信小程序自动化教程
    Android的WebView调试工具(无需FanQ,可同时调试多个设备,永不过期)
    Android通过Chrome Inspect调试WebView的H5 App出现空白页面的解决方法(不需要FQ)
    appium+java(四)微信公众号自动化测试
    基于APPIUM测试微信公众号的UI自动化测试框架
    Appium测试微信公众号
    通过Debugx5在电脑端调试微信页面
    微信小程序自动化测试实践
    Rocketmq和Kafka区别
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8183472.html
Copyright © 2011-2022 走看看