C++中一个关于复制构造函数和指针的问题

来源:互联网 发布:我怎样解题 知乎 编辑:程序博客网 时间:2024/06/06 14:17
Copy构造函数是显式地去处理一个对象初始化另一个对象的问题,如果类含有一个指针的话,那么处理起来主要分为两种情况。
A. 指针在类的构造或者初始化时指向动态分配的内存, 并在对象析构时对该指针进行delete操作,释放内存资源。
这种情况下,对指针的操作是万万不能简单对指针地址进行赋值操作的。应该是动态申请内存,然后按值Copy具体内容,从而防止指针指向无效内存地址的情况。
B. 指针指向一个生命周期大于该类所有对象生命周期的地址空间。
这种情况下,可以对指针直接赋值。
下面是示例代码:

#include <iostream>
using namespace std;

const int nLen = 64;
// Global Variable
const char gch[] = "Hello, wangzhaohua, I't your chance.";
char gch2[] = "Global variable test";

class myClass
{
public:
myClass();
~myClass();
myClass(const myClass &); //copy contructor
void myfun();
private:
int m_na;
char *pch; //dynamic create
char *pg; //point to a global variable
};

myClass::myClass()
{
m_na = 0;
pch = new char[nLen];
memset(pch, 0x0, nLen);
int nsize = sizeof(gch);
memcpy(pch, gch, nsize < nLen ? nsize : nLen);
pg = gch2;
}

myClass::~myClass()
{
cout << "In myClass::~myClass() " << endl;
if(pch != NULL)
{
delete[] pch;
pch = NULL;

pg = NULL;
}

myClass::myClass(const myClass &obj)
{
cout << "In the copy-constructor " << endl;
m_na = obj.m_na + 1; 
// pch = obj.pch //不能直接Copy指针的值,因为,如果obj消亡的时候,
//该指针指向的存储空间将被释放
//应该采用下面的方法
pch = new char[nLen]; //在堆上分配新的空间
memset(pch, 0x0, nLen); 
memcpy(pch, obj.pch, nLen); //将obj.pch指向的内容copy过来 
//obj.pg指向一个全局变量,obj消亡后,该全局变量的地址一直有效,故可以直接
//进行指针值的Copy.
pg = obj.pg; 
}

void myClass::myfun()
{
cout << m_na << " In myfun() " << endl;
cout << "m_na = " << m_na << endl;

cout << "pch = " << pch << endl;
cout << "pg = " << pg << endl;
}

int main(void)
{
cout << "Now, Let's begin ..." << endl;
myClass *pObj1 = new myClass; //堆上创建一个myClass对象
if(pObj1 == NULL)
return -1;
pObj1->myfun(); 

//Now using the copy-constructor;
cout << " Now copy-constructor " << endl;
myClass Obj2 = *pObj1; 
delete pObj1; //此时pObj1被delete,其成员指针pCh指向的内存区域无效

Obj2.myfun();
return 0;
}
0 0