这是对unique_ptr的误用吗?

时间:2017-07-14 13:32:30

标签: c++ c++11 c++14

我正在转向智能指针,我试图确保我正确使用它们。有很多问题可以解决何时使用每个问题,但我无法专门找到关于吸气剂的问题。

我有一个拥有指针的类,我希望其他类能够访问该指针(在步骤中重构遗留代码)。我想给这个类一个unique_ptr,因为它只拥有那个对象,但它们不能被复制。我应该返回对unique_ptr的引用,还是仅使用shared_ptr?

class B
{
 public:
    doAction() {};
};

class A
{
 private:
    std::unqiue_ptr<B> pointer;

 public:
    std::unique_ptr<B>& GetPointer()
    {
        return pointer;
    }

};

a.GetPointer()->doAction();

4 个答案:

答案 0 :(得分:6)

如果另一个类需要存储指针并且可能比A类寿命更长,请使用shared_ptr

如果没有,并且你的B对象应该在销毁A时被破坏,这是对unique_ptr的完全有效使用。

正如评论中所指出的,只有在允许其他类更改指针时才会出现这种情况。如果没有,返回一个原始指针。

两者之间的区别不在于谁有权访问该类,而在于谁负责销毁引用的对象。

答案 1 :(得分:5)

如果代码只需要通过unique_ptr访问B对象,那么最好只用pointer.get();返回原始指针。请记住,原始指针并不坏,拥有原始指针是。

答案 2 :(得分:1)

  

我应该返回对unique_ptr的引用,还是只使用shared_ptr?

取决于。

还有其他东西需要拥有指针吗?如果是,则使用共享所有权。如果您不需要共享所有权,则A可以是唯一所有者,因此unique_ptr是合适的。

但在这种情况下,我会向对象而不是unique_ptr返回一个引用(或一个原始指针,如果unique_ptr可能为null)。这封装了对所有权的控制,因此只能在成员函数中进行更改。如果你有一个返回对unique_ptr的引用的函数,那么你没有封装,你也可能首先以简单的名义公开unique_ptr

答案 3 :(得分:0)

返回原始指针或对指向的对象的引用。当一个对象持有std::unique_ptr时,这表示所有权。这意味着,持有指针的对象将分配并删除分配的资源。

例如:

class Car {
public:
  Engine* getEngine() const { return engine_.get(); }
private:
  std::unique_ptr<Engine> engine_;
}

你可能会要求汽车可能提供引擎,你应该总是假设它可能不在那里,但你绝对不应该解除它,它不是你的,它是由...拥有的车。