gpt4 book ai didi

c++ - 按值或 const ref 传递 std::shared_ptr 然后存储在容器中?

转载 作者:太空狗 更新时间:2023-10-29 20:37:51 24 4
gpt4 key购买 nike

考虑以下 vector :

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

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

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 到 vector 中,从而增加了 X 的引用计数。第一个函数导致引用计数的额外递增和递减,但这是不必要的。

我的理解对吗?因此,第二种选择更可取吗?

最佳答案

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

foo2您通过 const 传递参数(即共享指针)引用。因此,您传递了一个 const原始对象的合格别名(即,引用计数器不会增加)。

您还可以在以下示例中看到这一点:

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。即原始 shared_ptrmain 中定义和 foo1 中的拷贝.而在 foo2引用计数器保持为 1。

因此,您的推理是正确的。

关于c++ - 按值或 const ref 传递 std::shared_ptr 然后存储在容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33548918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com