我应该通过引用传递shared_ptr吗? [复制]

2024-01-03

传递shared_ptr的最佳实践是什么?

目前我传递shared_ptr函数参数,如下所示:

void function1( shared_ptr<TYPE>& value );

在受控情况下,您可以通过以下方式传递共享指针恒定参考。确保没有人同时删除该对象,但如果您仔细考虑引用对象,这应该不会太难。

一般来说,您应该将共享指针作为直接传递copy。这赋予了它预期的语义:包含共享指针副本的每个作用域都凭借其在所有权中的“共享”来保持对象的活动状态。

不总是按值传递的唯一原因是,由于原子引用计数更新,复制共享指针需要付出一定的代价;然而,这可能不是一个主要问题。


可选题外话:

既然主要问题已经得到解答,也许考虑一下您应该采取的几种方法是有启发性的never使用共享指针。这是一个小小的思想实验。让我们定义一个共享指针类型SF = std::shared_ptr<Foo>。为了考虑引用,而不是传递函数参数,让我们看看类型RSF = std::reference_wrapper<T>。也就是说,如果我们有一个共享指针SF p(std::make_shared<Foo>());,然后我们可以通过以下方式创建具有值语义的引用包装器RSF w = std::ref(p);。设置就这么多。

现在,每个人都知道指针的容器是雷区。所以std::vector<Foo*>维护起来将是一场噩梦,并且由于生命周期管理不当会产生许多错误。从概念上讲,更糟糕的是永远不清楚谁是owns容器存储其指针的对象。这些指针甚至可以是指向动态对象、自动对象和垃圾的指针的混合。没有人能说清楚。所以标准的解决方案是使用std::vector<SF>反而。这是使用共享指针的正确方法。另一方面,你绝对不能使用的是std::vector<RSF>——这是一个难以管理的怪物,实际上与裸指针的原始向量非常相似!例如,不清楚您所持有的引用的对象是否仍然存在。获取共享指针的引用已经违背了它的全部目的。

对于第二个例子,假设我们有一个共享指针SF p像之前一样。现在我们有一个函数int foo(SF)我们想要同时运行。通常std::thread(foo, p)工作得很好,因为线程构造函数创建了一个copy其论据。然而,如果我们说std::thread(foo, std::ref(p)),我们会遇到各种各样的麻烦:调用范围中的共享指针可能会过期并销毁对象,并且您将留下一个悬空引用和一个无效指针!

我希望这两个公认的相当人为的示例可以在您真正希望共享指针被传递时有所启发。copy。在设计良好的程序中,应该始终清楚谁负责哪些资源,并且如果使用得当,共享指针是完成这项工作的一个很好的工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该通过引用传递shared_ptr吗? [复制] 的相关文章

随机推荐