常见智能指针的.reset()方法

时间:2011-06-11 21:44:16

标签: c++

在我看来,boost scoped_ptr和shared_ptr中的reset方法会导致错误的构造和销毁顺序:

boost::scoped_ptr<Component> component(GetDefaultComponent());
component.reset(new BetterComponent); // 1. Creation of the new object
                                      // 2. Destruction of the old object

这是IMO的错误订单。

可以先调用不带参数的reset方法,然后设置新指针。然而,这对我来说似乎是一种解决方法。 (它是一种“解决方法”意味着存在问题。)

我确信提升人非常聪明。因此,目前的方法必须有理由。

有谁知道更多?

2 个答案:

答案 0 :(得分:13)

这绝对是正确的顺序。如果new BetterComponent抛出会发生什么?哎呦。这与所有事情发生的顺序相同,它被称为复制和交换,这是最好的方式。

特别是因为您实际上没有说明当前订单是错误的。

答案 1 :(得分:1)

你总是可以在免费功能中重构它(并且要注意异常安全后果):

template<typename T, typename Pointer, typename... U>
void
emplace_reset(Pointer& pointer, U&&... u)
{
    pointer.reset();
    pointer.reset(new T(std::forward<U>(u)...));
}
// use as: emplace_reset<BetterComponent>(component);

但这是一种解决方法,因为重置成员就像宣传的一样。您要求的是一项新功能。

不提供所需功能的可能理由(超出异常安全/事务语义)是指针永远不会创建它们指向的对象:构造函数承担所有权,但就是这样。 reset以这种方式保持一致。