通过引用传递与通过shared_ptr传递

时间:2014-01-30 14:31:14

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

Stackoverflow上的大多数问题都在询问shared_ptr是应该通过ref还是通过值传递的。不过我的问题是这样的例子:

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样式,我不需要。

我在单线程环境中使用此功能

2 个答案:

答案 0 :(得分:8)

如果该功能关注的是shared_ptr,通常是因为它想要保留副本,或shared_ptr

其他任何事情都会降低功能的适用性而无法获得。

答案 1 :(得分:1)

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

这很重要的一种情况是,如果你的函数执行了异步操作,它可能希望在操作完成后使用你的对象,那时你的对象可能已被删除,所以如果你通过引用传递,那么引用是悬空,如果你通过shared_from_this(),你可以保证你的物体的寿命会延长到功能需要的时间。 (boost::asio的大多数示例均基于此逻辑。)