c++中深拷贝与浅拷贝有什么区别

  介绍

这篇文章将为大家详细讲解有关c++中深拷贝与浅拷贝有什么区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>浅拷贝

只是对指针的拷贝,拷贝后两个指针指向同一个内存空间;

<强>深拷贝

对指针指向的内容进行拷贝(重新分配内存),经深拷贝后的指针是指向不同地址的指针;

因此浅拷贝释放内存的时候很容易出现因为释放两个指针而内存出错。

<强>浅拷贝(释放时,因为多次释放出错)

只拷贝指针

//拷贝构造函数
  向量(const  Vector,, v)
  的地方(nullptr)
  _finish (nullptr)
  _endOfStorage (nullptr)
  {
  的地方=v._start;
  _finish=v._finish;
  _endOfStorage=v._endOfStorage;
  }

<>强深拷贝

对资源进行拷贝

,向量(const  Vector< T>,, v)      的地方(nullptr)   ,_finish (nullptr)   ,_endOfStorage (nullptr)   {   size_t  n =, v.capacity ();   时间=_start  new  T [n];   for  (size_t 小姐:=,0;,小姐:& lt;, v.size ();, + + i)   {   的地方(我),=,v(我);   }   +=_finish  _start  v.size ();   +=_endOfStorage  _start  n;   }

写一个向量的类

, template   class 向量   {   时间T * typedef 运营商;   typedef  const  T *, const_iterator;   iterator 地方;   iterator  _finish;   iterator  _endOfStorage;      ,公众://构造函数   ,向量()   的地方(nullptr)   ,_finish (nullptr)   ,_endOfStorage (nullptr)   {}//析构函数   ~向量()   {   如果(的地方)   {   删除[],地方;   星=_finish=_endOfStorage=nullptr;   }   }   T&,运营商[](size_t  pos)   {   if  (pos 祝辞=,0,,,,pos  & lt;,大小())   return 地方(pos);   }   size_t 大小(),const   {   return  _finish 安康;地方;   }   ,   size_t 能力()常量   {   return  _endOfStorage 安康;地方;   }         };

可以用自己编辑器,把拷贝放进去试试;

<强>附:c++深拷贝与浅拷贝问题实例

浅拷贝:简单的赋值拷贝操作,

深拷贝:在堆区重新申请空间,再进行拷贝操作,

问题:浅拷贝会带来堆区内存被重复释放的问题,析构函数被调用多次,导致程序运行崩溃;

解决:通过深拷贝解决,在堆区重新申请内存,各自释放自己的内存,避免重复释放;

# include  & lt; iostream>      using  namespace 性传播疾病;      class 人   {   公众:   ,,,的人(),{   ,,,,,,,cout  & lt; & lt;,“人的默认构造函数调用“& lt; & lt; endl;   ,,,}   ,,,的人(int  int 年龄;高度),{   ,,,,,,,m_Age =,年龄;   ,,,,,,,m_Height =, new  int(高度);//堆区重新申请空间,进行深拷贝,手动申请,手动释放;   ,,,,,,,cout  & lt; & lt;,“人的有参函数调用“,& lt; & lt;, endl;   ,,,}   ,,,int  m_Age;   ,,,int  * m_Height;      ,,,//自己实现拷贝构造函数,来避免编译器的拷贝构造函数造成浅拷贝问题;   ,,,的人(const  Person&, p), {   ,,,,,,,cout  & lt; & lt;,“人拷贝构造函数“,& lt; & lt;, endl;   ,,,,,,,m_Age =, p.m_Age;   ,,,,,,,//m_Height =, p.m_Height;,浅拷贝,编译器默认实现这行代码;   ,,,,,,,m_Height =, new  int (* p.m_Height);//深拷贝   ,,,}      ,,,~人(),{   ,,,,,,,//析构代码,将堆区开辟数据做释放操作   ,,,,,,,if  (m_Height  !=, NULL), {   ,,,,,,,,,,,delete  m_Height;   ,,,,,,,,,,,m_Height =,空;   ,,,,,,,}   ,,,,,,,cout  & lt; & lt;,“人的析构函数调用“,& lt; & lt;, endl;   ,,,}   };      void  test01 () {   ,,,Person  p1 (18160);   ,,,cout  & lt; & lt;,“p1的年龄为:“,& lt; & lt;, p1.m_Age<& lt;“p1身高为:“& lt; & lt; * p1.m_Height<& lt;, endl;   ,,,Person  p2 (p1);//编译器默认调用拷贝构造函数,进行浅拷贝操作   ,,,cout  & lt; & lt;,“p2的年龄为:“,& lt; & lt;, p2.m_Age<& lt;,“p2身高为:“& lt; & lt; * p2.m_Height  & lt; & lt;, endl;   }      int  main () {   ,,,test01 ();   ,,,系统(“pause");   }

c++中深拷贝与浅拷贝有什么区别