【发布时间】:2015-06-21 01:04:35
【问题描述】:
我有一个函数定义如下:
void foo(std::shared_ptr<X> x) { ... };
如果我向X声明一个共享ptr:
std::shared_ptr<X> sourcePtr(new X(...));
然后我可以拨打foo如下:
foo(std::move(sourcePtr));
或
foo(sourcePtr);
我知道如果我使用第一个选项,那么sourcePtr 将变为空。它是否也阻止了引用计数的增加?
如果没关系,我应该更喜欢哪个选项?在做出这样的决定时,我是否应该考虑其他任何事情?
【问题讨论】:
-
简而言之,您是对的,参考计数器不会增加。但是我看不到它的实际用途,除非你想强制你传递的指针应该被清空,在这种情况下你可以使用
std::unique_ptr。您不应该真正将新的智能指针视为 pointer,而应该从 资源所有权 的角度来看待它们。资源可以仅由单个实体 (std::unique_ptr) 或由多个实体 (std::shared_ptr) 拥有。 -
这是一个非常相似的问题,虽然我不确定是否完全重复:stackoverflow.com/questions/10953325/…。这个问题是关于将参数传递给函数 - 这种方式不同......
-
@JoachimPileborg 这是一些测试代码的简化示例,它并不能说明整个故事,但可以让我将问题专门集中在我想知道的内容上。
Foo需要在我的应用程序中使用shared_ptr,但在调用它之后测试代码不需要sourcePtr。
标签: c++ c++11 shared-ptr move-semantics