我正在转向智能指针,我试图确保我正确使用它们。有很多问题可以解决何时使用每个问题,但我无法专门找到关于吸气剂的问题。
我有一个拥有指针的类,我希望其他类能够访问该指针(在步骤中重构遗留代码)。我想给这个类一个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();
答案 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_;
}
你可能会要求汽车可能提供引擎,你应该总是假设它可能不在那里,但你绝对不应该解除它,它不是你的,它是由...拥有的车。