c – 我应该通过引用传递shared_ptr吗? [重复]

这个问题已经有一个答案在这里:            >            shared_ptr by reference or by value?                                    7答案                            传递shared_ptr的最佳实践是什么?

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

void function1( shared_ptr<TYPE>& value );
在受控情况下,可以通过常量引用传递共享指针。确保没有人同时删除对象,但如果你仔细地向谁提供引用,这不应该太难。

通常,应该将共享指针作为直接传递。这给它它的意图语义:每个包含共享指针的副本的范围由于它在所有权中的“共享”而保持对象活着。

不总是通过值的唯一原因是复制共享指针由于原子引用计数更新而以一定的价格出现;然而,这可能不是一个主要的关注。

可选离散:

因为主要问题已经回答了,也许有一些启发,考虑你不应该使用共享指针的几种方法。这里是一个小思想实验。让我们定义一个共享指针类型SF = std :: shared_ptr< Foo&gt ;.为了考虑引用,而不是传递函数参数,让我们看看类型RSF = std :: reference_wrapper< T&gt ;.也就是说,如果我们有一个共享指针SF p(std :: make_shared< Foo>());那么我们可以通过RSF w = std :: ref(p);做一个带有值语义的引用包装。这么多的设置。

现在,每个人都知道指针的容器是雷区。所以std :: vector< Foo *>将是一个噩梦维护,并且任何数量的错误由不当的生活管理产生。在概念上更糟糕的是,它永远不清楚谁拥有的容器存储的指针的对象。指针甚至可以是指向动态对象,自动对象和垃圾的指针的混合。没有人能告诉。所以标准的解决方案是使用std :: vector< SF>代替。这是使用共享指针的正确方法。另一方面,你从不使用的是std :: vector< RSF> – 这是一个难以管理的怪物,其实是非常类似于裸指针的原始矢量!例如,不清楚您持有引用的对象是否仍然活着。参考共享指针已经击败了其整个目的。

对于第二个例子,假设我们有一个共享指针SF p,如前所述。现在我们有一个函数int foo(SF),我们要同时运行。通常的std :: thread(foo,p)工作正常,因为线程构造函数复制其参数。但是,如果我们说std :: thread(foo,std :: ref(p)),我们会遇到各种麻烦:在调用范围中的共享指针可能会过期并销毁对象,你会离开带有悬空引用和无效指针!

我希望这两个公认的有限的例子阐明了当你真正想要你的共享指针通过拷贝传递。在一个精心设计的程序中,应该始终清楚谁负责哪些资源,当使用正确时,共享指针是一个伟大的工具。

http://stackoverflow.com/questions/8385457/should-i-pass-a-shared-ptr-by-reference

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 我应该通过引用传递shared_ptr吗? [重复]