为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符


为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
摘自effectiveC++第11条

例如这个类里没有声明赋值操作符和拷贝构造函数,这会带来一些不良后果。

class CFoo
{
public:
  CFoo() {data = new char[10];}
  ~CFoo() {delete [] data;}

  // 没有拷贝构造函数和operator=

private:
  char *data;
};
CFoo a, b;

当b = a时,因为没有自定义的operator=可以调用,c++会生成并调用一个缺省的operator=操作符。这个缺省的赋值操作符会执行成员指针的赋值操作。

第一,b成员指针曾指向的内存永远不会被删除,因而会永远丢失,产生内存泄漏。第二,现在a和b包含的成员指针指向同一个字符串,那么只要其中一个析构时,就会删除掉另一个指针还指向的那块内存。

CFoo c = a时,会调用拷贝构造函数,因为它也没有在类中定义,c++以与处理赋值操作符一样的方式生成一个拷贝构造函数并执行相同的动作:对对象里的指针进行逐位拷贝。这会导致同样的问题,但不用担心内存泄漏,因为被初始化的对象还不能指向任何的内存。不过,假如c被a初始化后,成员指针会指向同一个地方,那这个地方会被删除两次。

对于有些类,可以确信程序中不会做拷贝和赋值操作的时候,可以只声明这些函数(声明为private成员)而不去定义(实现)它们。这就防止了会有人去调用它们,也防止了编译器去生成它们。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值