在我看来,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方法,然后设置新指针。然而,这对我来说似乎是一种解决方法。 (它是一种“解决方法”意味着存在问题。)
我确信提升人非常聪明。因此,目前的方法必须有理由。
有谁知道更多?
答案 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
以这种方式保持一致。