提升shared_from_this <>()

Gea*_*phy 15 c++ boost boost-bind boost-asio

有人可以用一些简洁的词汇总结如何使用boost shared_from_this<>()智能指针,特别是从使用bind函数在io_service中注册处理程序的角度来看.

编辑:一些回复要求更多背景.基本上,我正在寻找"陷阱",人们使用这种机制观察到的反直觉行为.

Ben*_*Ben 31

我遇到的最大"问题"是从构造函数中调用shared_from_this是非法的.这直接遵循以下规则:在调用shared_from_this之前,必须存在对象的shared_ptr.

  • +1好建议,通常我使我的构造函数提供并提供静态`shared_ptr <Type> create`方法. (4认同)
  • 我想你的意思是你让你的构造函数私有化. (3认同)

Ken*_*mon 14

根据我的理解,有时候在你的代码中你需要一个类来提供shared_ptr自己的代码,以便代码的其他部分可以在构造之后获得类的对象的shared_ptr.

问题是,如果你的类只有一个shared_ptr<>自己作为一个成员变量,它将永远不会被自动销毁,因为总有"最后一个引用"挂在自身.继承enable_shared_from_this为您的类提供了一个自动方法,该方法不仅返回a shared_ptr,而且仅将弱共享指针保存为成员变量,以免影响引用计数.这样,当最后一次引用它时,你的类将像往常一样被释放.

我从来没有用过它,但这是我对它是如何工作的理解.


sth*_*sth 9

shared_from_this<>如果对象想要访问shared_ptr<>指向自身的对象,则使用它.

通常,对象只知道隐式this指针,但不知道任何shared_ptr<>管理它.此外,this无法轻松转换为shared_ptr<>与其他现有shared_ptr<>实例共享所有权,因此对象无法轻松获得有效shared_ptr<>的自身.

shared_from_this<>可以用来解决这个问题.例如:

struct A : boost::enable_shared_from_this<A> {
   server *io;
   // ...

   void register_self() {
      io->add_client(shared_from_this());
   }
};
Run Code Online (Sandbox Code Playgroud)


Sam*_*ler 6

boost::asio::io_service 析构函数文档解释了它相当不错

上述销毁序列允许程序通过使用shared_ptr <>来简化其资源管理.如果对象的生命周期与连接的生命周期(或其他一些异步操作序列)相关联,则对象的shared_ptr将绑定到与其关联的所有异步操作的处理程序中.其工作原理如下:

  • 当单个连接结束时,所有关联的异步操作都将完成.销毁相应的处理程序对象,并销毁对对象的所有shared_ptr引用.
  • 要关闭整个程序,调用io_service函数stop()以尽快终止所有run()调用.上面定义的io_service析构函数会破坏所有处理程序,导致对所有连接对象的所有shared_ptr引用都被销毁.

通常,您的对象将链接异步操作,其中处理程序使用boost::bind和绑定到成员函数boost::shared_from_this().有一些例子使用这个概念.