c++深拷贝与浅拷贝

来源:互联网 发布:什么是软件的ppt 编辑:程序博客网 时间:2024/05/22 04:43
 

 先谈深拷贝与浅拷贝

      如果类中存在变量或者对象,没有指针成员或者引用(即类没有资源,资源可以理解成动态申请的空间),可以使用默认的拷贝构造函数或者赋值运算符来实现浅拷贝。如果有指针,就不能这样默认的来实现。

     深拷贝的思路,就是让目标对象与源对象的内存空间互相独立,相应的指针成员指向各自的内存空间,然后把源对象的数据完全复制到目标对象中去。

 

下边的例子:

#include <iostream>
using namespace std;

class CDeepCopy
{
public:
        int n;
        int *p;

        CDeepCopy();
        CDeepCopy(int);
        ~CDeepCopy();

        //CDeepCopy(const CDeepCopy &r);
        //CDeepCopy& operator = (const CDeepCopy& r);
};

CDeepCopy::CDeepCopy()
{
      n = 0;
      p = NULL;
}

CDeepCopy::CDeepCopy(int k)
{
       p = NULL;
       n = k;
       p = new int[n];
}

CDeepCopy::~CDeepCopy()
{
       static int num = 1;
       //cout<<num++<<endl;
       if (p != NULL)
      {
             delete [] p;
      }
}

/*
CDeepCopy::CDeepCopy(const CDeepCopy &r)
{
      n = r.n;
      p = new int[n];
      memcpy(p, r.p, n*sizeof(int));
}*/

/*
CDeepCopy& CDeepCopy::operator = (const CDeepCopy &r)
{
      if (n != r.n)
      {
             n = r.n;
             if (p != NULL)
             {
                    delete [] p;
             }
            p = new int[n];
      }

      memcpy(p, r.p, n*sizeof(int));
      return *this;
}*/

int main()
{
      CDeepCopy a(2);
       a.p[0] = 1;
       a.p[1] = 2;

       CDeepCopy b(a);
        b.p[0] = 3;
        b.p[1] = 4;

       cout<<"a对象的两个值:"<<" "<<a.p[0]<<" "<<a.p[1]<<endl;
       cout<<"b对象的两个值:"<<" "<<b.p[0]<<" "<<b.p[1]<<endl;

       return 0;

}

 

结果分析:

把拷贝构造函数隐去:

结果为:a对象的两个值: 3 4
                b对象的两个值: 3 4

                然后是死机(死机的情况后边讨论)

 

使用拷贝构造函数后:

结果为:a对象的两个值: 1 2
                b对象的两个值: 3 4

 

这样问题就浮现出来了,没使用拷贝构造函数,对象b中的指针p指向的地址是对象a中指针p指向的地址

现在就可以讨论没有拷贝构造函数后死机的情况了,在对象a的析构函数中将指针p申请的空间释放掉,但由于对象b中的指针p指向的是对象a中指针p指向的地址

在对象a执行完后,释放了空间。对象b又去释放对象a中指针p指向的地址,所以就死机了。

 

问题继续扩展:

如果将类中的析构函数给隐去,即不释放对象中指针申请的空间,那应该就不死机了。这种情况测试一样,结果和预想的一样,不死机了。

结果仍然是:a对象的两个值: 3 4
                        b对象的两个值: 3 4

                        然后不死机

这样很明显,造成了内存泄露。

 

总结:

         深拷贝与浅拷贝区别就是让每个类对象的成员是否独立。

原创粉丝点击