我想知道何时应该使用unique_ptr
(或boost::scope_ptr
)代替本地对象。
我可以想到两种可能的情况:
超过线程堆栈大小的对象很大。但在这种情况下,您总是可以增加线程的大小。
多态性。例如unique_ptr<C> p; if ... p.reset(new C1); else p.reset(new C2);
。但我不确定我们到底需要什么。如果此p
是函数的参数,我们只需说:if ... foo(new C1); else foo(new C2);
是否还有其他情况我们应该使用unique_ptr
而不是本地对象?
答案 0 :(得分:4)
多态性是一个常见的原因。一个典型的例子是您的对象是由返回unique_ptr
:
std::unique_ptr<C> factoryFunction(int arg) {
switch (arg) {
case 1:
return std::make_unique<C1>();
case 2:
return std::make_unique<C2>();
default:
return nullptr;
}
}
void someFunction(int arg) {
auto c = factoryFunction(arg);
if (c) {
// do something with c...
}
}
在评论中,如果您需要一个比声明范围更长的变量,则表示您更喜欢shared_ptr
。我认为你应该更喜欢unique_ptr
。通过返回unique_ptr
,您将所有权转移给来电者。就像上面的factoryFunction
一样。或者也许是为了返回一个昂贵的移动物体:
using BigArray = std::array<BigPOD, 1000>;
std::unique_ptr<BigArray> getBig() {
auto big = std::make_unique<BigArray>();
// fill big...
return big;
}
unique_ptr
的开销低于shared_ptr
,它使所有权更加清晰。如果需要共享所有权,我只会使用shared_ptr
。
将unique_ptr
传递给函数意味着您将所有权转移到函数中(&#34;接收器&#34;)。例如构造函数:
class Foo {
private:
std::unique_ptr<BigArray> array_;
public:
Foo(std::unique_ptr<BigArray> array) : array_(std::move(array)) {}
};
void someFunction() {
auto big = getBig();
auto foo = Foo(std::move(big));
// do something with foo...
}