C++ 拷贝构造函数中的指针问题

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;
}
   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值