【问题标题】:having shared_ptr as a parameter of a function [duplicate]将 shared_ptr 作为函数的参数[重复]
【发布时间】:2013-06-13 13:12:50
【问题描述】:

我仍然很难理解为什么

void work_with_foo(shared_ptr<foo> _foo);

相比

不推荐
void work_with_foo(foo* _foo)

我理解work_with_foo(foo&amp; _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?

【问题讨论】:

  • 秋千和环形交叉路口 - 应允许函数假定其参数在调用期间保持有效。
  • 这将为您的问题提供广泛的答案:Herb Sutter: GotW #92, Smart Poitners as Parameters
  • "如果有人打电话给delete _foo怎么办?"如果有人在您的shared_ptr 上拨打delete _foo.get() 怎么办?在始终使用智能指针的代码库中,应该理解原始指针永远不会拥有所有权 - 它们用作可能为空的引用,或者用作原始数组的迭代器。没有别的了。

标签: c++ shared-ptr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    void work_with_foo(const foo& _foo);
    

    或者做那个

    void work(const foo& _foo);
    

    在调用站点,取消引用shared_ptr。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 传递shared_ptr 对象意味着复制所有权,否则会产生不必要的惩罚。
      • 会产生什么惩罚(如果你通过 const-ref 传递 shared_ptr)?
      • 我不是在谈论传递对它的引用。您暗示没有人会建议不要传递 shared_ptr 对象。我不同意。按值传递shared_ptr 的代价是引用计数更新,如果对象被同时访问,它可能会也可能不会阻塞线程。
      猜你喜欢
      • 2019-03-30
      • 2013-08-13
      • 2013-08-02
      • 2012-05-14
      • 1970-01-01
      • 2018-01-02
      • 2019-07-23
      • 2011-04-07
      相关资源
      最近更新 更多