c++中深、浅拷贝的相关问题

转载 2018年04月17日 04:50:19

浅拷贝和深拷贝

  在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。

  深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。下面举个深拷贝的例子。


#include
 <iostream>
using namespace std;
class CA
{
 public:
  CA(int b,char*
 cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA&
 C)
  {
   a=C.a;
   str=new char[a];
//深拷贝
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<<str<<endl;
  }
  ~CA()
  {
   delete str;
  }
 private:
  int a;
  char *str;
};
 
int main()
{
 CA
 A(10,"Hello!");
 CA
 B=A;
 B.Show();
 return 0;
}

深拷贝好还是浅拷贝好?

如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。



C++(笔记)深浅拷贝and何时调用

一、何时调用拷贝函数 何时会调用拷贝函数? 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Person p = q;...
  • w_linux
  • w_linux
  • 2017-03-23 22:23:44
  • 472

浅拷贝和深拷贝(谈谈java中的clone)

clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有...
  • u014727260
  • u014727260
  • 2017-02-12 19:51:31
  • 4603

浅拷贝导致的问题

昨天在工作中遇到一个问题,这样: while(...) { ..... //昨天在做装备洗练功能的时候,点击洗练按钮整个程序就挂掉了,找了半天,发现是下面这个问题。 //这样赋值后,第一次循环结...
  • qweewqpkn
  • qweewqpkn
  • 2015-11-13 13:36:35
  • 705

结构体对齐,结构体深拷贝和浅拷贝

 3.结构体对齐,结构体深拷贝和浅拷贝
  • toto1297488504
  • toto1297488504
  • 2014-08-01 01:27:47
  • 2142

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

深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题。尤其对于初学者来说,我们有必要来好好研究下这个概念。我会以实际代码来演示,相关示例代码上传至 这里 。   ...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016-06-28 01:41:07
  • 9331

浅拷贝、深拷贝、浅赋值、深赋值

一、浅拷贝     对象初始化对象的时候调动拷贝构造函数,只是拷贝指针指向的拷贝构造称为浅拷贝。 当要析勾的时候对象被一一析勾的时候,第二个析勾的对象就找不到需要释放的空间,程序报错。 ...
  • littesss
  • littesss
  • 2017-07-04 16:51:34
  • 633

iOS 浅拷贝和深拷贝的区别? copy和mutableCopy的区别?

1.概念       我们在声明一个变量时怎么给变量赋值呢?      第一种情况:将其它变量的值直接拿过来赋值,例如Person *person = 0x100104520;      Person...
  • vbirdbest
  • vbirdbest
  • 2016-07-09 16:54:03
  • 1410

vector 浅拷贝

浅拷贝和深拷贝,以及push_back()的奥秘[原创] 2008-09-29 10:38 下列代码有哪些错误? #include using namespac...
  • zb872676223
  • zb872676223
  • 2014-07-25 10:38:26
  • 1330

C++ 拷贝构造函数中浅拷贝与深拷贝

浅拷贝构造函数 看一段拷贝构造函数的代码#include #include using namespace std; class Array{ public : Array(){ ...
  • libin66
  • libin66
  • 2016-11-12 13:48:02
  • 3266

深拷贝和浅拷贝的理解与应用

深拷贝和浅拷贝的理解与应用 对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部...
  • u014628388
  • u014628388
  • 2017-08-22 23:55:01
  • 1402
收藏助手
不良信息举报
您举报文章:c++中深、浅拷贝的相关问题
举报原因:
原因补充:

(最多只允许输入30个字)