在赋值操作符中析构和重构对象是一个坏主意吗?



自从c++ 11标准发布以来,我就很少编程了,所以我仍在学习一些较新的习惯用法以及如何使用它们。

我一直在思考如何编写高效的赋值操作符,我刚刚发现了放置new的工作原理。

所以现在我考虑通过(1)销毁对象和(2)使用放置new来调用复制构造函数来编写赋值操作符,如:

MyClass& MyClass::operator=(const MyClass& other)
{
if (&other == this)
return (*this);
this -> ~MyClass();
return *(new (this) MyClass(other));
}

通常我不会在销毁对象之后再使用它。但是,我马上重建了它。这个习语使用起来安全、优雅吗?或者这是个糟糕的主意,我应该立即

delete this;

这种方法并不新鲜,以前也有人尝试过。如注释中所述(其余部分不那么严重),主要问题是在调用复制构造函数期间可能抛出异常。

如果发生这种情况,您将处于非常糟糕的情况—您已经调用了析构函数,因此该对象不再有效,并且无法撤销。即使捕获了异常,仍然没有好的追索权,因为您无法做任何事情来恢复对象。

也有一些类在调用析构函数之前需要一定的前置条件(std::thread就是一个典型的例子)。虽然我个人不喜欢这样,但这些类确实存在。

如果您正在为自己的完全控制的类执行此操作,并且您知道事实上复制构造函数不会抛出(并且理想情况下是这样注释的),并且可以接受类的随机析构,则此方法是可行的-尽管通常不值得。

相关内容

最新更新