在this source file中有两个类:tcp_connection
和tcp_server
。在我看来,我已经选择了相关的代码,但您可能需要参考完整的源代码以获取更多信息。
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));
}
};
我的问题很简单:我们会在shared_from_this
函数中使用bind
作为async_write
参数,并使用this
作为bind
参数
async_accept
功能?
答案 0 :(得分:4)
共享指针控制动态分配对象的生命周期。每个保持指针都会增加引用计数,当所有保持的指针都消失时,将释放引用的对象。
只有一台服务器,并且它没有动态分配。相反,实例的寿命比接受器(以及可能的io_service)长,因此没有所有异步操作都可以信任该对象保持足够长的时间。
每个客户端生成一个新连接,动态分配(make_shared)一个tcp_connection
实例,然后在其上启动异步操作。
服务器不保留共享指针的副本,因此当连接上的所有异步操作完成时(例如因为连接被丢弃),tcp_connection
对象将被释放
但是,因为当异步操作正在进行时,对象必须不,所以需要将完成处理程序绑定到共享指针(shared_from_this
)而不是{{1} }。