构造函数与拷贝解析

本文探讨了在C++中如何正确实现拷贝构造函数来管理类中的资源,特别是动态分配的内存。通过实例说明了如果拷贝构造函数实现不当可能导致资源管理错误,甚至引发程序崩溃。
当我们声明一个类的时候,可能会需要另外一个类的实体去初始化一个新定义的类。
// 类定义
// 此类只能实现数据的拷贝,而不能够对资源进行操作。
class ScreenOnlyCopyData
{
public:
      
short height(){/* ... */}
      
short weight(){/* ... */}
      
string  screen(){/*...*/}

private:
     
string _screen;
     
string::size_type _cursor;
     
short   _height,_weight;
}
;
//当有一个类对象实现时,
        ScreenOnlyCopyData s1;
        
//对s1进行操作.....
      ScreenOnlyCopyData s2=s1;
     
//等同于下面的语句
        s2._screen = s1._screen;
        s2._cursor 
= s1._cursor;
        s2._height 
= s1._height;
        s2._weight 
= s1._weight;
//所以,当我们定义了一个带有资源分配的类类型时,在类之间相互拷贝必须重新构造拷贝构造函数,
// 否则将只对值进行简单的赋值过程,最终导致两个类对象指向同一个资源,在其中一个对象将
// 资源析构时,另一个对象原本指向资源的指针将指向一个未定义的资源,从而导致错误的发生。
// 具体见下面的代码,为使分析简单,仅使用两个成员。

Class NoResourceToCopy
{
public:
      NewResource(size_type len)
{*= new int [len];} 
      
~NoResourceToCopy(){delete []p;}
private:
       
int *p;
       
int s;
}
;

NoResourceToCopy nr1;
nr1.NewResource(
10);
NoResourceToCopy nr2
=nr1;               //特殊语句1
//按上面的解释,这特殊语句1应该等同于下面的语句的集合
// nr2.p=nr1.p;
// nr2.s=nr2.s;
// 所以,当nr1析构时,nr2中的p指向的内存块是不明确的,因此会出现错误。
// 因此为使特殊语句1能够成功获取资源,需要如下的定义。

Class RecourseToCopy
{
public:
    RecourseToCopy()
{}
    ResourceToCopy( ResourceToCopy 
& )
   
{}
   
~RecourseToCopy(){}
private:
    
int *p;
    
int len;
}
;

RecourseToCopy::ResouceToCopy()
{
    
*=NULL:
   len
= 0;
}


ResourceToCopy::ResourceToCopy(ResourceToCopy 
&s)
{
   
if(NULL == s.p)
    
{      
        
this->p=NULL;
        
this->len=0;
   }

   
this->p=new int[s1.len];   //只有在此处再次申请资源,才能保证s1被解析时,p不是野指针。
   this->len =s1.len;
}

ResourceToCopy ::
~ResouceToCopy()
{
     delete []p;
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值