c++ 深拷贝与浅拷贝

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。

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

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++ 深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

C++的深拷贝与浅拷贝

C++深拷贝与浅拷贝

Cpp下的深拷贝与浅拷贝探究

Java 深拷贝与浅拷贝概念与代码实现

通过项目实战学习:深拷贝与浅拷贝的内涵,实现深拷贝的几种方法,深拷贝解决项目异常bug

iOS开发——深拷贝与浅拷贝详解