使用交换对象自杀

Using swap with object suicide

本文关键字:对象 交换      更新时间:2023-10-16

我正在查看Boost。任何源代码和void clear()的实现看起来都是这样的:

void clear() BOOST_NOEXCEPT
{
   any().swap(*this);
}

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

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

除了方法swap是一个简单的线性外,这种方法还有其他优点吗?

您的版本之所以有效,是因为它完成了析构函数delete content的工作,然后是默认构造函数content = 0的工作。我只能通过检查any.hpp.中的代码来相当确定您的实现是正确的

Boost版本在不重复构造函数和析构函数代码的情况下完成相同的工作。如果执行情况发生变化,它将继续工作。我也可以相当肯定,它是正确的,而不看其他来源。

这是关于模块化的,关于不重复自己。

您的版本在多个地方有效地运行了析构函数和构造函数逻辑。原始代码通过swap(无论如何都需要定义)将这种权力下放给析构函数和构造函数本身,这样就不需要在两个地方维护它。

功能最终结果是相同的。