首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在for循环中构造shared_ptr并进行移动分配

在for循环中构造shared_ptr并进行移动分配
EN

Stack Overflow用户
提问于 2022-05-17 15:35:46
回答 1查看 213关注 0票数 0

我正试着把我的头放在分享的指点上,以及它们是如何工作的。我非常感谢你能在下面给我的任何建议。

请你就下列事项提出建议:

当使用std::

  • in make_shared

  • ,如果它是在使用emplace_back和某些用户输入构造的对象上使用make_shared构造的,则该对象指向的是什么,然后该对象就从作用域消失了,例如,在我编写的for循环中,

代码语言:javascript
复制
vector_declared_outside_for_loop.emplace_back(std::make_shared(object(std::string user_input)))

,在for循环结束后,for循环中的shared_ptr会发生什么?

如果我现在在后续的for循环(如..)中从vector_declared_outside_for_loop和其他变量(如int number_input )中生成一个shared_ptrs对向量,则为number_input。

代码语言:javascript
复制
std::vector<std::pair<shared_ptr<object>, int>> new_vector;

    for(int i{0}; i<.size(); ++i){

   new_vector.push_back(std::make_pair(shared_ptr<object> vector_declared_outside_for_loop [i], int connection_type));

   }

shared_ptrs在new_vector中是否指向任何东西?还是我只是把new_vector推回去了?

EN

Stack Overflow用户

发布于 2022-05-17 16:04:34

  • --每当您有不再使用的命名对象时,就使用std::move。只需忘记所有您认为您知道的关于std::move的知识,并学习一个简单的规则:std::move的意思是:我不再需要这个(名称对象)。

所以func1(std::move(func2(...)))是没有意义的。返回的对象没有名称,您无法再次使用它。编译器知道这一点,并且已经在没有std::move的情况下使用move。说我不再需要这是没有意义的,因为在func1调用之后,临时对象不再存在。

  • make_shared分配要指向的新对象并将其构造到位。但是,当您在emplace_back中放置的是shared_ptr,而不是它所指向的对象时。因此,shared_ptr是在vector内部构造的,其中有一个指向它分配和构造的对象的指针。

for循环中的shared_ptr根本不存在。这就是emplace_back的要点,即它不创建临时对象,而是直接在向量内部构造对象。

  • push_back通常接受一个对象并将其复制到向量中。因此,您将创建一个临时对象,复制并销毁该临时对象。但STL并不愚蠢,也涵盖了这个案子。如果您push_back一个可以移动的对象,那么它将被转发到emplace_back。因此,这对将直接构造在向量内。

这就剩下vector_declared_outside_for_loop了。因为它是一个现有的对象,所以不能就地构造。因为它是一个命名的对象,所以不能移动它。所以这些对象就会被复制。

对于shared_ptr,这意味着内部指针将被复制,对象的引用计数将以原子方式递增。因此,在循环的末尾,shared_ptr将有一个.size() + 1的引用计数。然后,在作用域的末尾,原始shared_ptr超出范围,将引用数减少1。向量中使用的对象保持不变。。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72276914

复制
相关文章

相似问题

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