读书人

拷贝构造函数的有关问题

发布时间: 2012-03-08 13:30:13 作者: rapoo

求助,拷贝构造函数的问题!
#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)

读书人网 >C++

热点推荐