Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60457
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 267
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-29 13:17
文章分类

全部博文(34)

文章存档

2014年(1)

2013年(33)

我的朋友

分类: C/C++

2013-09-03 16:38:06

一,声明一个含有指针成员的类NoName
  1. struct NoName
  2. {
  3. public:
  4.     NoName(): pstring( new std::string ), i(0), d(0) { }//默认构造函数
  5.     

    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的应用,并限定为只读
      
  6. private: 
  7.     std::string *pstring;
  8.     int i;
  9.     double d;
  10. };
二,在类外定义,复制构造函数

  1. NoName( const NoName& orig ) : pstring(new string(*(orig.pstring))), i(orig.i), d(orig.d){}

三,定义其赋值操作符

点击(此处)折叠或打开

  1. NoName& operator= ( const NoName &Nn ) 
  2. {
  3.     (Nn.i);
  4.     (Nn.d);
  5.     pstring = new string;
  6.     *pstring = *( Nn.pstring );
  7.     return *this;
  8. }
内存泄漏的原因
这样的,这个函数涉及两个参数  一个是this,一个是rhs,对吧。
 从this的角度来看,我赋值了一个新的pstring
从rhs的角度来看,我是const对象,里面的值都是不变的。 
 当this和&rhs相等的时候,你能告诉会怎么么。。
 如果执行完这个函数,pstring还是最开始的值,那么我new的指针就没法释放了 
 如果执行网这个函数,pstring是新new出来的值,那么原来的指针你没释放。。
这种情况下,怎么都是有内存释放的问题。
 所以说,赋值构造函数,要避免自己赋值给自己
 operator=的第一步就是判断  if(this == &rhs) return *this;

阅读(453) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~