码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 深拷贝与浅拷贝

时间:2016-06-20 15:49:34      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

 浅拷贝:只是将数据成员的值进行简单的拷贝

class Array
{
public:
    Array(){m_iCount=5;}
    Array(const Array &arr)
    {
        m_iCount=arr.m_iCount;
    }
private:
    int m_iCount;          
}
int main()
{
    Array arr1;
    Array arr2=arr1;
    return 0;
}

什么是深拷贝,请看下面的程序,分析其中的错误。

 
class Array
{
public:
    Array(){m_iCount=5;m_pArr=new int[m_iCount];}
    Array(const Array &arr)
    {
        m_iCount=arr.m_iCount;
        m_pArr=arr.m_pArr;
    }
private:
    int m_iCount;
    int *m_pArr;          
}
int main()
{
    Array arr1;
    Array arr2=arr1;
    return 0;
}

arr1.m_pArr与arr2.m_pArr将会指向同一块内存,这样在操作一个对象进行写值得时候会覆盖掉另一个对象的值,更严重的是当我们销毁一个对象的内存时,另一个对象内存也会被销毁,这样就会导致一块内存被销毁两次,如果你觉得没问题那一定是你的脑子有问题,计算机也会提出抗议,这样崩溃的不止是计算机,还有初学者的自信,因为计算机也会给你报一段晦涩难懂的错误。正确的结果应当是两个对象的指针应当指向不同的内存,拷贝时不该将内存的指针进行拷贝,而应该是将内存中的每一个元素进行拷贝。

我们应该将代码写成一下这种方式

 1 class Array
 2 {
 3 public:
 4     Array(){m_iCount=5;m_pArr=new int[m_iCount];}
 5     Array(const Array &arr)
 6     {
 7         m_iCount=arr.m_iCount;
 8         m_pArr=new int[m_iCount];
 9         for(int I=0;i<m_iCount;i++)
10         {
11             m_pArr[i]=arr.m_pArr[i];
12         }
13     }
14 private:
15     int m_iCount;
16     int *m_pArr;
17 };

当对对象进行拷贝时不是做简单的对象的值的拷贝而应该将堆中的数据也进行拷贝,这种拷贝模式叫做深拷贝

 

c++ 深拷贝与浅拷贝

标签:

原文地址:http://www.cnblogs.com/jin521/p/5600488.html

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