我想知道什么时候应该使用unique_ptr
(或boost::scope_ptr
)而不是本地对象。
我能想到两种可能的情况:
-
对象的大小超过了线程的堆栈大小。但在这种情况下,您总是可以增加线程的大小。
-
多态性。例如CCD_ 3。但我不确定我们什么时候需要这个。如果这个
p
是一个函数的参数,我们可以简单地说:if ... foo(new C1); else foo(new C2);
还有其他情况吗,我们应该使用unique_ptr
而不是本地对象?
多态性
多态性是一个常见的原因。一个典型的例子是,您的对象是由一个返回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;
}
CCD_ 12的开销比CCD_ 13小,并且使所有权更加清晰。只有在需要共享所有权的情况下,我才会使用shared_ptr
。
将unique_ptr
传递到函数中意味着将所有权转移到函数中("接收器")。例如构造函数:
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...
}