我读过关于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恢复它,但是如果我们将原始指针从shared_ptr传递到somewhere,那么我们就会有问题,因为如果我们从std::shared_ptr::get获取指针,并将原始指针传递给某人,那么所有shared_ptr的安全性都会消失。
发布于 2015-11-20 09:53:11
你的类中有一个方法需要给出弱的或共享的指针。不仅仅是返回,还可以调用不同的函数,将指向自身的shared_ptr传递给它。
你要么用一个共享的ptr - to - this来扩充这个方法,把它变成一个接受共享ptr的非方法,要么在类中存储一个弱的ptr,要么继承自enable_shared_from_this。
enable_shared_from_this基本上就是“给你自己存储一个weak_ptr”,通过创建代码来初始化它。
发布于 2015-11-20 09:57:38
Y::f()可能想要调用另一个函数,该函数将shared_ptr<Y>或shared_ptr转换为某个其他类型,该类型恰好是Y的子对象或成员。
发布于 2019-01-15 02:41:20
我想我找到了一个更令人满意的真实例子。
在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保持活动状态可以确保它的持续时间不会比它应该存在的时间更长或更短:它的持续时间正好是协助请求和返回所需的时间。
https://stackoverflow.com/questions/33816169
复制相似问题