【发布时间】:2016-09-09 12:47:38
【问题描述】:
我不确定要使用哪种类型的智能指针,因为我不确定我的班级的所有用例。我可以只使用共享指针,但是当我不一定需要共享所有权时,我不喜欢在我的代码中到处传递共享指针的想法。 Herb Sutter 的This article 说,如果有疑问,请使用 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...
}
如果有人对如何处理此类情况有更好的了解,我会很高兴听到。
【问题讨论】:
-
unique_ptr 和 shared_ptr 是为了拥有所涉及的内存,而不是简单地使用它。您不会经常传递 shared_ptr ——因为与普通指针/引用相比,它们的制作成本相对较高。
-
Example总是是否需要维护其节点的所有权,有时其他对象也需要该节点的所有权? -
从上面的示例中,您的指针似乎应该是
shared_ptr,因为您希望(可能)共享所有权。工厂可能会发生疑问。 -
我不确定您的问题的意图。你是问如何让
example参与其转换后的unique_ptr的分享? -
getPtr是一个坏接口。你不应该像那样传递unique_ptr。如果有人想访问指针,他们应该得到一个Node*。
标签: c++