繁体   English   中英

这是对unique_ptr的误用吗?

[英]Is this a misuse of unique_ptr?

我正在转向智能指针,我正在努力确保我正确使用它们。 有很多问题涉及何时使用每个问题,但我无法找到关于吸气剂的具体问题。

我有一个拥有指针的类,我希望其他类能够访问该指针(在步骤中重构遗留代码)。 我想给类一个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();

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

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

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

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

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

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

这取决于。

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

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

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

例如:

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

您可能会要求汽车可能提供的发动机,您应该始终认为它可能不在那里,但您绝对不能解除它,它不是您的,它是由汽车拥有的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM