我仍然很难理解为什么
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?
答案 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
值可能并不是很好,但这并不意味着你需要回到原始指针。