2017-07-14 112 views
4

我正在向智能指针转变,我试图确保我正确使用它们。有很多问题涉及何时使用每个问题,但我无法找到有关获得者的具体问题。这是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(); 
+3

我个人使用原始指针或引用为非拥有访问。 (如果允许该值为空,则使用指针;否则使用引用) – 0x5453

+3

这将允许调用者执行'a.GetPointer()。重置();'可能不完全是你想到的。 ''返回pointer.get();' –

回答

6

如果其他类需要存储的指针和潜在的生活比你的A级长,使用shared_ptr

如果不是,并且您的B对象应该在破坏A时被破坏,则这是unique_ptr的完全有效使用。

正如在评论中指出的,这只有在其他类也被允许改变你的指针时才成立。如果不是,则返回一个原始指针。

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

5

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

+0

或者返回一个引用,这也表明没有返回“所有权”:'B&GetBReference()'返回一个原始指针可能是最好的。 {return * pointer; }' – Matthias247

1

我应该返回一个对unique_ptr的引用,或者只是使用shared_ptr?

这要看情况。

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

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

0

返回一个原始指针或对被指向的对象的引用。当一个对象持有std::unique_ptr这表明所有权。意思是,持有指针的对象将分配,并且在它满意时删除分配的资源。

例如:

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

您可以要求汽车的可能可用的发动机,你应该总是假设它可能不存在,但你一定要永远不会释放它,它不是你的,它是由拥有汽车。