值型类,赋值操作符的问题
类定义见如下代码。其中赋值操作符的定义,方案(1)和(2)哪个正确,为什么?
class HasPtr
{
public:
HasPtr( const int &p, int i ): ptr( new int( p ) ), val( i ) { }
HasPtr( const HasPtr &obj ): ptr( new int( *obj.ptr ) ), val( obj.val ) { }
HasPtr& operator = ( const HasPtr &obj )
{
//ptr = new int( *obj.ptr ); // 方案(1)
*ptr = *obj.ptr; // 方案(2)
val = obj.val;
return *this;
}
~HasPtr()
{
delete ptr;
}
int get_ptr_val() const
{
return *ptr;
}
void set_ptr_val( int p ) const
{
*ptr = p;
}
private:
int *ptr;
int val;
};
主函数:
int main()类 值型类?赋值操作符
{
int obj = 0;
HasPtr ptr1( obj, 42 );
HasPtr ptr2 = ptr1; // 两种方案都不报错。
ptr1 = ptr2; // 两种方案都不报错。
ptr1.set_ptr_val( 44 );
cout << ptr2.get_ptr_val() << endl;
return 0;
}
[解决办法]
好吧,我看错了。。。方案(2)
[解决办法]
HasPtr ptr2 = ptr1;并不会调用赋值操作符,而是会调用拷贝构造函数,也就是HasPtr( const HasPtr &obj ): ptr( new int( *obj.ptr ) ), val( obj.val ) { }
方案一有内存泄露。