c ++ 11:std :: enable_shared_from_t这个现实生活中的例子?

时间:2015-11-19 23:19:11

标签: c++ c++11 boost

我读到了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安全就会消失, 并将原始指针传递给某人。

3 个答案:

答案 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_connectionhttps://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html

那么,这个服务器做什么?它创建一个tcp连接,以等待请求并返回白天。

如您所见,该连接包含套接字和一个字符串(资源保持活动状态)。因此,将在其上调用async_readasync_write。为了使tcp_connection实例保持活动状态,将shared_from_this()传递给管道中的每个处理程序,将tcp_connection的生存期绑定到处理程序的生存期:该状态将精确地保持生存期为需要。如果管道中存在另一个阶段,则可以将参考计数转发到下一个管道阶段。以这种方式使tcp_connection保持活动状态可以确保它不会持续比预期更长或更短的时间:它将精确地满足请求和返回所需的条件。