一,声明一个含有指针成员的类NoName
-
struct NoName
-
{
-
public:
-
NoName(): pstring( new std::string ), i(0), d(0) { }//默认构造函数
-
NoName( const
NoName& orig ) : pstring(new string(*(orig.pstring))), i(orig.i), d(orig.d)
NoName( const
NoName& orig ) : pstring(new string(*(orig.pstring))), i(orig.i), d(orig.d)
NoName( const NoName& orig );//声明一个复制构造函数,参数为NoName对象orig的应用,并限定为只读
-
private:
-
std::string *pstring;
-
int i;
-
double d;
-
};
二,在类外定义,复制构造函数
-
NoName( const NoName& orig ) : pstring(new string(*(orig.pstring))), i(orig.i), d(orig.d){}
三,定义其赋值操作符
-
NoName& operator= ( const NoName &Nn )
-
{
-
(Nn.i);
-
(Nn.d);
-
pstring = new string;
-
*pstring = *( Nn.pstring );
-
return *this;
-
}
内存泄漏的原因
这样的,这个函数涉及两个参数 一个是this,一个是rhs,对吧。
从this的角度来看,我赋值了一个新的pstring
从rhs的角度来看,我是const对象,里面的值都是不变的。
当this和&rhs相等的时候,你能告诉会怎么么。。
如果执行完这个函数,pstring还是最开始的值,那么我new的指针就没法释放了
如果执行网这个函数,pstring是新new出来的值,那么原来的指针你没释放。。
这种情况下,怎么都是有内存释放的问题。
所以说,赋值构造函数,要避免自己赋值给自己
operator=的第一步就是判断 if(this == &rhs) return *this;
阅读(506) | 评论(0) | 转发(0) |