1

我仍然很难理解为什么

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?
4

3 回答 3

4

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

于 2013-06-13T13:18:00.293 回答
2

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

void work_with_foo(const foo& _foo);

或者做那个

void work(const foo& _foo);

并在调用站点取消引用shared_ptr.

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

于 2013-06-13T13:17:20.803 回答
0

为什么你认为通过ashared_ptr是“不推荐”的?谁反对它?

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

于 2013-06-13T13:17:22.900 回答