c – 通过value或const ref传递std :: shared_ptr然后存储在容器中?
作者:互联网
考虑以下向量:
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