深拷贝和浅拷贝的区别?
当一个对象需要复制或者拷贝的时候,系统会调用默认的构造函数,完成数据成员的一一复制,这种叫做浅拷贝。
一般情况下,浅拷贝是没有什么问题的,但如果数据成员有指针的时候,浅拷贝是出问题的,会导致内存泄露或者程序崩溃。
这时,应该使用深拷贝,就是自定义一个拷贝构造函数,为对象申请一块新的内存空间。

具体例子:

   
   
   
   
  1. #include  
  2. #include 
  3. #include 
  4. using namespace std; 
  5.  
  6. class CDemo{ 
  7. public
  8.     CDemo(){str=NULL;printf("浅拷贝\n");};//浅拷贝 
  9.     CDemo(const CDemo &cd) 
  10.     { 
  11.         this->str=new char[strlen(cd.str)+1]; 
  12.         strcpy(str,cd.str); 
  13.         printf("深拷贝"); 
  14.     } 
  15.     ~CDemo() 
  16.     { 
  17.         if (str)delete[]str; 
  18.     } 
  19.     char*str; 
  20. }; 
  21. int main(int argc,char**argv) 
  22.     CDemo Dl; 
  23.     Dl.str=new char[32]; 
  24.     strcpy(Dl.str,"helloworld"); 
  25.     vector*ptr=new vector(); 
  26.     ptr->push_back(Dl);//调用深拷贝 
  27.     delete ptr; 
  28.     return EXIT_SUCCESS; 
  29.  

程序输出:浅拷贝

                深拷贝

简析:如果没有第二个拷贝构造函数CDemo(const CDemo &cd),程序崩溃,不能运行。加上即可。

原因在于:ptr->push_back(Dl)将CDemo类型的对象Dl拷贝到vector向量中,默认情况下调用浅拷贝,当ptr指向vector的变量的内存释放后,vector中存放的CDemo对象调用自身的析构函数,释放内存。但由于两个对象的数据成员str指向的是同一内存地址,被释放了两次,导致程序崩溃。
相反,如果定义了深拷贝构造函数,复制过来的对象申请了新的内存空间,不会产生问题。