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。我花了几本书才真正得到你的答案,但现在它清楚多了!谢谢你给我一个明确的答案。我也向你学习。谢谢:)