【问题标题】:Pass by reference vs. Pass by shared_ptr通过引用传递与通过 shared_ptr 传递
【发布时间】:2014-01-30 14:31:13
【问题描述】:

Stackoverflow 上的大多数问题都是关于 shared_ptr 应该通过 ref 或 value 传递。但是我的问题是这样的:

class Foo;

void function1(Foo & ff) { ff.m_abc = 1024; }
void function2(const std::shared_ptr<Foo> & ff) { ff->m_abc = 1024; }

function1function2 可以使用和更改 ff 的某些部分。


我的情况:

我需要使用 arg *thisshared_from_this() 调用函数。

print(msg, *this);

or

print(msg, this->shared_from_this());

我可以在我的代码中为函数使用function1function2 样式。

但是,如果我使用function2风格,我需要实现Foo来继承std::enable_shared_from_this,但是使用function1风格,我不需要。

我在单线程环境中使用这个函数

【问题讨论】:

  • 我不确定我在这里看到了问题。
  • 请务必在需要确保引用计数不为零的地方传递值。
  • 要么我是,另外,通过shared_ptr,意味着你需要检查nullptr。
  • 我假设 some 其他对象已经有一个shared_ptrthis?在这种情况下,print(msg, *(this-&gt;shared_from_this())) 使function1 的行为与function2 相同,假设function2 不复制shared_ptr
  • 不,Foo 类现在不继承自 std::enable_shared_from_this。如果我使用 function2 方法,我必须添加这个继承。

标签: c++ c++11 shared-ptr


【解决方案1】:

只有在函数关心 shared_ptr 时,你才将 shared_ptr 传递给函数,通常是因为它想要保留一个副本,或者是 weak_ptr

其他任何事情都只会降低函数的适用性而没有任何好处。

【讨论】:

  • 它希望至少在函数执行期间保留一份副本。在多线程环境中,这可能是一个问题。我不确定我是否同意这个答案。
  • 调用者有责任确保它对函数的引用在函数运行时不会变得无效。其他任何事情都是疯狂的。如果调用者的堆栈上有shared_ptr,那么你是安全的。
  • 如果源代码的shared_ptr 可以被多个线程修改,那么这两种解决方案都不安全。
  • 如果function1 实际将指针存储在工作线程使用的vector &lt;shared_ptr&gt; (&amp;ff) 中,那会怎样?
  • @JohnDibling 然后你开枪打死你的开发人员,因为他们从周日开始搞砸了 3 种方式。从引用创建shared_ptr?坏的。为您未创建的资源创建shared_ptr?坏的。为您未创建的资源创建 shared_ptr enable_shared_from_this 而不是调用 shared_from_this?他们最好带甜甜圈。
【解决方案2】:

如果你想与你正在调用的函数共享对象的所有权,你应该传递一个shared_ptr,也就是说,如果你想确保该对象只要函数需要它就处于活动状态。

这很重要的一种情况是,如果您的函数执行异步操作,它可能希望在操作完成后使用您的对象,到那时您的对象可能已被删除,因此如果您通过引用传递,则该引用是悬空,而如果您传递了shared_from_this(),则可以保证对象的生命周期将延长到函数需要的时间。 (例如大多数code samples of boost::asio 都是基于这个逻辑)。

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 2013-04-21
    • 2011-08-21
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2020-04-01
    相关资源
    最近更新 更多