gpt4 book ai didi

c++ - 在赋值运算符中析构和重建对象是一个坏主意吗?

转载 作者:行者123 更新时间:2023-12-04 08:12:00 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What is the copy-and-swap idiom?

(5 个回答)



Is it valid to directly call a (virtual) destructor?

(3 个回答)


7 个月前关闭。




在 C++11 标准出现之前,我没有编写太多程序,所以我仍在学习一些较新的习语以及如何使用它们。
我一直在思考如何编写高效的赋值运算符,而我刚刚发现了 Placement 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 是一个主要的例子)。虽然我个人不喜欢这样,但这些类是存在的。
如果你是为你自己的完全控制的类做这个,你知道一个事实复制构造函数不会抛出(并且理想情况下这样注释),并且类的随机销毁是可以接受的,这种方法是可行的 - 尽管,通常不值得。

关于c++ - 在赋值运算符中析构和重建对象是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65908314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com