我读到了std::enable_shared_from_this
,我了解它是如何运作的,但我不明白它要解决的问题是什么?
例如,从这里:What is the usefulness of `enable_shared_from_this`?
class Y: public std::enable_shared_from_this<Y>
{
public:
std::shared_ptr<Y> f()
{
return shared_from_this();
}
};
std::shared_ptr<Y> p(new Y);
std::shared_ptr<Y> q = p->f();
是的,我们可以写q=p->f();
,但为什么不呢
q = p;
?
一般情况下,我们有shared_ptr
,但由于某种原因它不可用somewhere
,所以我们必须从this
恢复,但是如果我们从{{传递原始指针1}}到shared_ptr
然后我们遇到问题,因为如果我们从somewhere
获取指针,所有shared_ptr
安全就会消失,
并将原始指针传递给某人。
答案 0 :(得分:2)
你的类中有一个方法需要分发弱指针或共享指针。不仅仅是返回,而且可能调用一个不同的函数,将指向自身的shared_ptr传递给它。
您必须使用shared-ptr-to-this扩充方法,将其更改为采用共享ptr的非方法,在类中将弱ptr存储到此方法,或者从enable_shared_from_this继承。
enable_shared_from_这基本上是&#34;将weak_ptr存储到你自己&#34;,在shared-ptr创建代码的帮助下初始化它。
答案 1 :(得分:2)
Y::f()
可能想要调用另一个函数,该函数将shared_ptr<Y>
或shared_ptr
转换为恰好是Y
的子对象或成员的其他类型。
答案 2 :(得分:2)
我认为我找到了一个更令人满意的现实例子。
在Boos.Asio中,您可以异步编程。当您调用异步函数时,它将立即返回。尽管您想保持某些资源存活,但是这些超出了范围。如何以一种不错的方式实现异步编程?
嗯,模式正在考虑管道,例如,您要在其中侦听连接并稍后执行一些操作。在这里查看课程tcp_connection
:https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html
那么,这个服务器做什么?它创建一个tcp连接,以等待请求并返回白天。
如您所见,该连接包含套接字和一个字符串(资源保持活动状态)。因此,将在其上调用async_read
和async_write
。为了使tcp_connection
实例保持活动状态,将shared_from_this()传递给管道中的每个处理程序,将tcp_connection
的生存期绑定到处理程序的生存期:该状态将精确地保持生存期为需要。如果管道中存在另一个阶段,则可以将参考计数转发到下一个管道阶段。以这种方式使tcp_connection
保持活动状态可以确保它不会持续比预期更长或更短的时间:它将精确地满足请求和返回所需的条件。