首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

,拷贝构造函数的有关问题

2012-03-08 
求助,拷贝构造函数的问题!#include stdafx.h#include iostreamusing namespace stdclass Test{ // 深

求助,拷贝构造函数的问题!
#include "stdafx.h"
#include <iostream>
using namespace std;

class Test 
{ // 深拷贝测试类
private:
  char *pBuffer;

public: 
  Test():pBuffer(0){
  cout<<"载入:默认-构造函数"<<endl;  
  }
  Test(const char* content):pBuffer(0)
  {
  cout<<"载入:赋值-构造函数"<<endl;
  pBuffer=new char[strlen(content)+1];
  strcpy(pBuffer,content);
  }
  ~Test() { 
  cout<<"载入:析构函数"<<endl;  
  if(pBuffer!=NULL){
  delete []pBuffer;
  }  
  } 
  // 深拷贝构造函数
  Test(const Test& srcObj) {  
  cout<<"载入:深拷贝-构造函数"<<endl;
  *this=srcObj; //调用重载后的"="
  }  
  // 重载赋值符"="  
  Test& operator = (const Test& srcObj)  
  {  
  cout<<"重载赋值符->被调用"<<endl;
  if(this != & srcObj) {// 下面这段如不注释,只要对象的pBuffer未初始化就出错,CallTesing就废了!
  /*
  if(pBuffer!=NULL){// 删除原指针指向内容 
  delete[] pBuffer;  
  pBuffer=NULL;
  }*/  
  pBuffer=new char[strlen(srcObj.pBuffer)+1]; // 复制指针指向的内容
  strcpy(pBuffer,srcObj.pBuffer);
  }
  return *this; //返回自身引用  
  }
  void show(){ cout<<pBuffer<<endl; }  
}; 

// 测试返回对象的调用(x=CallTesting())
Test CallTesting() {  
#if 0
  cout<<"CallTesting:返回无名对象"<<endl;
  return Test("zzzzzzzzz"); // 这句返回了无名对象,不会触发重载赋值符的调用!
#endif
  cout<<"CallTesting:返回普通对象(临时对象)"<<endl;
  Test a("zzzzzzzzz"); 
  return a; // 临时对象由a进行了深拷贝,触发重截赋值符的调用!(临时对象的成员指针并未初始化!)  


int main()
{
  cout<<"深拷贝构造函数的演示-返回对象:"<<endl<<"--------------------------"<<endl;
  Test m("mmmmm"); 

  Test x=m; x.show(); // x的pBuffer未初始化!重载赋值里如果有内存释放会出错!  
  x =CallTesting(); x.show(); // CallTesting()的临时对象的pBuffer也未初始化!重载赋值里如果有内存释放会出错!

  m=x; m.show(); // 如果重载赋值里不做内存释放,m应该会造成内存泄漏的呀!(郁闷)

  cin.get();  
  return 0;
}

m=x;这句应该造成内存泄漏的,不过VS2010没有提示。怪.....
哪位大侠帮帮手,即让main()的代码不用改,又不出现内存泄漏的情况。谢谢了!。。。。。。。。。。。。。。。。。 


[解决办法]
/*
if(pBuffer!=NULL){// 删除原指针指向内容
delete[] pBuffer;
pBuffer=NULL;
}*/

这段代码出错无非是因为pBuffer的未初始化,那你在拷贝构造函数里把它初始化为0就是了,跟你在其它构造函数里一样:
Test():pBuffer(0)
Test(const char* content):pBuffer(0)

热点排行