ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 通过value或const ref传递std :: shared_ptr然后存储在容器中?

2019-08-29 17:06:12  阅读:255  来源: 互联网

标签:reference-counting c shared-ptr pass-by-value pass-by-const-reference


考虑以下向量:

std::vector<std::shared_ptr<X>> myVector;

以及以下两个将给定元素添加到向量的函数:

void foo1(std::shared_ptr<X> x)
{
    myVector.push_back(x);
}

void foo2(const std::shared_ptr<X>& x)
{
    myVector.push_back(x);
}

我的理解是两个函数都将shared_ptr推送到向量中,从而增加了X的引用计数.第一个函数导致引用计数的额外增量和减量,但这是不必要的.

我的理解是否正确?第二种选择因此更可取吗?

解决方法:

在foo1中,您按值传递参数(即共享指针).因此,std :: shared_ptr< X>的复制构造函数.将被唤起(即,当foo1调用本地副本的析构函数时,ref计数器将增加然后减少).

在foo2中,您通过const引用传递参数(即共享指针).因此,您传递原始对象的const限定别名(即,不会增加ref计数器).

您还可以在以下示例中看到此信息:

struct X {};

void foo1(std::shared_ptr<X> x) { 
  std::cout << "count in foo1(): " << x.use_count() << std::endl;
}

void foo2(const std::shared_ptr<X>& x) {
  std::cout << "count in foo2(): " << x.use_count() << std::endl;
}

int main() {
  std::shared_ptr<X> x(new X);
  std::cout << "count in main(): " << x.use_count() << std::endl;
  foo1(x);
  foo2(x);
}

输出:

count in main(): 1
count in foo1(): 2
count in foo2(): 1

正如你在foo1中看到的那样,不同的shared_ptr实例的数量是2.这是在main中定义的原始shared_ptr和foo1中的副本.然而,在foo2中,ref计数器仍为1.

因此,你的推理是正确的.

标签:reference-counting,c,shared-ptr,pass-by-value,pass-by-const-reference
来源: https://codeday.me/bug/20190829/1762212.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有