首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用std::move with std::shared_ptr

使用std::move with std::shared_ptr
EN

Stack Overflow用户
提问于 2015-04-15 15:21:57
回答 1查看 30.7K关注 0票数 32

我有一个定义如下的函数:

代码语言:javascript
复制
void foo(std::shared_ptr<X> x) { ... };

如果我向X声明一个共享ptr

代码语言:javascript
复制
std::shared_ptr<X> sourcePtr(new X(...));

然后,我可以按如下方式调用foo

代码语言:javascript
复制
foo(std::move(sourcePtr));

代码语言:javascript
复制
foo(sourcePtr);

我知道如果我使用第一个选项,那么sourcePtr将变为null。它是否也阻止了引用计数的递增?

如果这无关紧要,我应该选择哪个选项?在做出这样的决定时,我是否应该考虑其他因素?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-15 15:31:51

可以,如果将共享指针移动到函数中,则:

  1. 原始sourcePtr将变为null,
  2. 引用计数不会被修改。

如果您知道在函数调用之后将不再需要sourcePtr的值,那么将其移动到函数中是一种轻微的优化,因为它节省了原子增量(当sourcePtr超出作用域时,随后还会减少)。

但是,要注意标识符sourcePtr对于作用域的其余部分仍然有效,只是它持有一个空指针。这意味着如果你在移动之后使用它,编译器不会报错,但如果你忘记了它是从哪里移来的,你很可能会取消对null的引用。我经常使用这个“优化”的move,我也被它咬了几次:这个函数增加了更多的功能,如果你忘记撤销这个move,你就会崩溃。

因此,当你不再需要它的时候移动它是一个轻微的优化加上轻微的维护负担。在你的情况下,你可以权衡哪个更重要。

上面假设在其声明和对foo的最终调用之间存在实际使用sourcePtr的代码(感谢@WhozCraig指出这一点)。如果没有,最好直接在调用点创建指针:

代码语言:javascript
复制
foo(std::make_shared<X>(...));

这样,您可以节省相同数量的原子操作,并且不会出现潜在危险的空共享指针。

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29643974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档