Pie*_* P. 2 c++ smart-pointers boost-asio
在此源文件中,有两个类: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));
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:什么将我们使用shared_from_this的bind的内参数async_write功能和使用this作为一个bind在中参数
async_accept的功能?
共享指针控制着动态分配对象的生命周期。每个保持的指针都会增加一个参考计数,当所有保持的指针都消失时,引用的对象将被释放。
只有一台服务器,并且不会动态分配。相反,实例的寿命比接受器(可能还有io_service)的寿命长,因此没有所有异步操作都可以信任对象以使其存活时间足够长。
每个客户端产生一个新的连接,动态分配(make_shared)一个tcp_connection实例,然后在其上启动异步操作。
服务器并不能保持共享指针的拷贝,所以当在连接完成所有异步操作(例如,由于连接断开)的tcp_connection对象将被释放。
但是,由于在进行异步操作时不得破坏对象,因此需要将完成处理程序绑定到共享指针(shared_from_this)而不是this。
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |