将shared_ptr作为函数的参数

时间:2013-06-13 13:12:50

标签: c++ shared-ptr

我仍然很难理解为什么

void work_with_foo(shared_ptr<foo> _foo);

相比,不建议使用

void work_with_foo(foo* _foo)

我理解work_with_foo(foo& _foo)更好,但指针作为参数!如果有人拨打delete _foo怎么办?

有人可以解释我为什么吗? 我总是使用shared_ptr,例如,在我的代码中......

shared_ptr<foo> ptr_foo(new foo);
//calling work_with_foo which takes foo pointer
work_with_foo(ptr_foo); //will  this even work?

3 个答案:

答案 0 :(得分:4)

如果被调用的函数仅对现有对象进行操作而不会获取(共享)所有权,则传递shared_ptr有点误导。与传递对象参考相比,它还会有额外的引用计数成本。

答案 1 :(得分:2)

实际上,如果要传递对象的函数不需要任何所有权转移,最好的方法是:

void work_with_foo(const foo& _foo);

或制作

void work(const foo& _foo);

在通话网站上,取消引用shared_ptr

如果您的函数需要修改指向的对象,请删除const。请注意,这也适用于基类指针和继承等。

答案 2 :(得分:0)

为什么你认为传递shared_ptr是“不推荐”?谁推荐反对呢?

需要注意的一件事是,通过const-ref传递shared_ptr可能更好,因为在调用函数之后,您将避免在引用计数增加之前递减它。因此,在某些情况下,传递shared_ptr值可能并不是很好,但这并不意味着你需要回到原始指针。