C++实现类的拷贝赋值运算符的注意事项

本文探讨了C++中拷贝赋值运算符的实现细节,特别是当目标对象与源对象相同时可能引发的错误。通过一个具体例子,讲解了如何避免自赋值时的内存管理问题,确保程序的健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++实现类的拷贝赋值运算符的注意事项

**当编写赋值运算符是应记住:**将一个对象赋予它自身,赋值运算符应能正确工作!

比如说有这么一个类:

class Test {
public:
  Test(const std::string &s = std::string())
      : ps(new std::string(s)), i(0) {}
  Test(const Test &ori)
      : ps(new std::string(*ori.ps)), i(ori.i) {}
  ~Test();

  Test &operator=(const Test &rhs);

private:
  std::string *ps;
  int i;
};
Test::~Test() {
  delete ps;
}

如果你的赋值运算符这么写:

Test &Test::operator=(const Test &rhs) {
  delete ps;
  ps = new std::string(*rhs.ps);
  i = rhs.i;
  return *this;
}

那么如果rhs和 *this是同一个对象时,delete会释放掉rhs和 *this指向的string,然后我们要new一个 *rhs.ps时,就会访问一个指向无效内存的指针而导致出错。

正确的做法:

Test &Test::operator=(const Test &rhs) {
  auto newps = new std::string(*rhs.ps);
  delete ps;
  ps = newps;
  i = rhs.i;
  return *this;
}

应先拷贝右侧运算对象,然后再删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值