我处于不确定要使用哪种类型的智能指针的情况,因为我不确定我的班级的所有用例。我可以只使用共享指针,但是当我不一定需要共享所有权时,我不喜欢在代码中到处传递共享指针的想法。 Herb Sutter 的 这篇文章 说,如果有疑问,请使用 unique_ptr 并在必要时转换为 shared_ptr。这是我想做的,但我不清楚应该如何做,考虑这个例子:
class Example
{
public:
Example(): _ptr(std::make_unique<Node>()) {}
std::unique_ptr<Node>& getPtr()
{
return _ptr;
}
private:
// I am unsure if I will eventually need shared ownership or not
std::unique_ptr<Node> _ptr;
};
Example* example = new Example();
// Some function somewhere
void f()
{
// I've decided I need shared ownership, converting
std::shared_ptr<Node> ptr(std::move(example->getPtr()));
// Oops, example is no longer valid...
}
如果有人对如何处理这种情况有更好的了解,我会很高兴听到它。
原文由 navark 发布,翻译遵循 CC BY-SA 4.0 许可协议
我认为您在问一种优化问题。您希望
Example
使用unique_ptr
因为它具有更简单和更有效的语义(解释您引用的文章)。但是,当需要时,您希望允许将指针转换为shared_ptr
。Example
应该简单地为此提供一个接口,并且当其用户调用该接口时,它本身需要从unique_ptr
转换为shared_ptr
。您可以使用状态模式来捕获实例是处于unique_ptr
模式还是shared_ptr
模式。如果状态机看起来很吓人(它应该是,因为它被过度设计了),那么您可以只在
Example
中维护两个指针,并且您的方法需要测试它需要使用哪一个。