赋值运算符的异常安全

编写赋值运算符时不仅考虑自赋值和内存泄漏问题,还要考虑到异常安全,当给待赋值对象分配内存以存储资源时,要考虑可能因内存不足抛出异常,这时应该保证实例对象状态不被改变。

class A
{
  /*...*/
private:
  char* ps;
};

A& A::operator=(const A& rhs)
{
  if (*this != rhs)
  {
   A temp(rhs); //这一步分配内存,如果抛出bad_alloc异常,
                //原来对象状态不会改变
   char* pTemp = temp.ps;
   temp.ps = ps;
   ps = pTemp.ps;
 }
 return *this; 
}

如果类定义了swap函数,一种更简单有效的方式是:拷贝并交换

A& A::operator=(A rhs) //分配内存在这
{
  swap(*this, rhs);//交换对象的数据成员
  return *this;
}

猜你喜欢

转载自blog.csdn.net/qq_38216239/article/details/81153428