使用swap进行对象自杀

3
我正在查看Boost.Any源代码,其中的void clear()实现如下:
void clear() BOOST_NOEXCEPT
{
   any().swap(*this);
}

它基本上创建了一个临时变量,并将数据与临时变量进行交换,然后临时变量将在其析构函数中删除。我本来会简单地写:

void clear() BOOST_NOEXCEPT
{
  delete content;
  content = 0;
}

除了方法swap是一个简单的一行代码之外,这种方法还有其他(不)优点吗?

2个回答

3
你的版本之所以有效,是因为它完成了析构函数的工作 - delete content - 然后完成了默认构造函数的工作 - content = 0。我只能通过检查 any.hpp 中的代码才能相当确定你的实现是正确的。
Boost 版本完成了相同的工作,而不重复构造函数和析构函数的代码。如果实现发生变化,它仍然可以正常工作。我也可以在不查看其余源代码的情况下相当确定它是正确的。

1
是的,我知道正在发生什么,我的问题是“为什么?”为什么要创建一个额外的对象来交换内容,而不是直接清除并自己设置它。 - Hatted Rooster
1
你问了你的方法的(不)优点是什么。我认为这回答了“为什么”的问题。你担心Boost实现会做额外的工作吗? - GuyRT

2

这是关于模块化和不重复造轮子的问题。

你的版本实际上在多个地方运行了析构函数和构造函数逻辑。原始代码通过 swap (无论如何都需要定义)将这种能力下放到析构函数和构造函数本身,以便您不需要在两个地方维护它。

功能上的最终结果是相同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接