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; }
function1
和function2
可能会使用和更改ff的某些部分。
我的情况:
我需要使用arg *this
或shared_from_this()
来调用函数。
print(msg, *this);
or
print(msg, this->shared_from_this());
我可以在代码中使用function1
或function2
样式作为函数。
但是,如果我使用function2
样式,我需要实现Foo
继承std::enable_shared_from_this
,但function1
样式,我不需要。
我在单线程环境中使用此功能
答案 0 :(得分:8)
如果该功能关注的是shared_ptr
,通常是因为它想要保留副本,或shared_ptr
。
其他任何事情都会降低功能的适用性而无法获得。
答案 1 :(得分:1)
如果你想与你正在调用的函数共享对象的所有权,你应该传递一个shared_ptr
,也就是说你想要确保只要函数需要它就会存活对象
这很重要的一种情况是,如果你的函数执行了异步操作,它可能希望在操作完成后使用你的对象,那时你的对象可能已被删除,所以如果你通过引用传递,那么引用是悬空,如果你通过shared_from_this()
,你可以保证你的物体的寿命会延长到功能需要的时间。 (boost::asio
的大多数示例均基于此逻辑。)