Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 来自此和此的共享\u用例_C++_Boost Asio_Smart Pointers - Fatal编程技术网

C++ 来自此和此的共享\u用例

C++ 来自此和此的共享\u用例,c++,boost-asio,smart-pointers,C++,Boost Asio,Smart Pointers,中有两类:tcp\u连接和tcp\u服务器。在我看来,我已经选择了相关的代码,但是您可能希望参考完整的源代码以获取更多信息 class tcp_connection : public boost::enable_shared_from_this<tcp_connection> { public: typedef boost::shared_ptr<tcp_connection> pointer; void start() { message_ = m

中有两类:
tcp\u连接
tcp\u服务器
。在我看来,我已经选择了相关的代码,但是您可能希望参考完整的源代码以获取更多信息

class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
  typedef boost::shared_ptr<tcp_connection> pointer;

  void start()
  {
    message_ = make_daytime_string();

    boost::asio::async_write(socket_, boost::asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this()));
  }
};

class tcp_server
{    
private:
  void start_accept()
  {
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.get_io_service());

    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          boost::asio::placeholders::error));
  }
};
class-tcp\u连接:public boost::从\u中启用\u共享\u
{
公众:
typedef boost::共享_ptr指针;
void start()
{
message_uu=make_daily_string();
boost::asio::异步写入(套接字),boost::asio::缓冲区(消息),
boost::bind(&tcp_connection::handle_write,shared_from_this());
}
};
类tcp_服务器
{    
私人:
void start_accept()
{
tcp_连接::指针新建_连接=
tcp_连接::创建(acceptor_u.get_io_service());
acceptor\异步\u accept(新建\u连接->套接字(),
boost::bind(&tcp\u server::handle\u accept,这个,新的\u连接,
boost::asio::占位符::错误);
}
};
我的问题很简单:我们在
async\u write
函数中将
shared\u from\u this
用作
bind
参数,并在


异步_接受
功能

共享指针控制动态分配对象的生存期。每个保持指针都会增加一个引用计数,当所有保持指针都消失时,被引用的对象将被释放

服务器 只有一台服务器,而且它不是动态分配的。相反,实例的生命周期比接受程序(可能还有io_服务)的生命周期长,因此并非所有异步操作都能信任对象足够长的生命周期

联系 每个客户端生成一个新连接,动态分配(使_共享)一个
tcp_连接
实例,然后在其上启动异步操作

服务器不保存共享指针的副本,因此当连接上的所有异步操作完成时(例如,由于连接已断开),将释放
tcp\u连接
对象


但是,由于在进行异步操作时对象必须被销毁,因此需要将完成处理程序绑定到共享指针(
shared\u from\u this
),而不是
this

可以引用
tcp\u连接的计数器
为0而不使用
shared\u from\u this()
tcp\u服务器的类似问题
。我会说是和否。
tcp\u服务器是在
共享的ptr中创建的吗
shared\u from\u this()
是UB(或抛出后C++17),如果不是的话。什么是UB@Caleth@Caleth尽管如此,它还是回答了一个错误的问题(问题不是你为什么不能从这个
中使用
共享,问题应该是为什么它没有被使用/需要)@PierreP。我花了几本书才真正得到你的答案,但现在它清楚多了!谢谢你给我一个明确的答案。我也向你学习。谢谢:)