2017-10-13 122 views
2

捕获此和shared_from_this()在升压async-tcp-echo-server例子有一个服务器类上一个新的连接创建会话:升压回声服务器实例和拉姆达

acceptor.async_accept(socket, [this](boost::system::error_code ec) { 
    if (!ec) 
     std::make_shared<session>(std::move(socket))->start(); 
    do_accept(); 
}); 

session::start()功能体:

void start() { do_read(); } 

session::do_read方法是私人会员功能:

void do_read() 
{ 
    auto self(shared_from_this()); 
    socket.async_read_some(boost::asio::buffer(data, sizeof(data)), 
     [this, self](boost::system::error_code ec, std::size_t length) { 
      if (!ec) 
       do_write(length); 
    }); 
} 

请纠正我,如果我错了。
会话类继承自std::enable_shared_from_this,因此在调用shared_from_this()时已创建控制块,并且不会发生未定义的行为。在do_read功能shared_from_this()函数用于允许do_write()方法在内存中仍然存在的对象上调用。如果不使用shared_from_this(),则在达到范围结束时可以删除该对象。

为什么在lambda表达式中捕获this
do_write()方法调用thisself

在C++ 14我能代替:

auto self(shared_from_this()); 
socket.async_read_some(boost::asio::buffer(data, sizeof(data)), 
    [this, self] ... 

有:

socket.async_read_some(boost::asio::buffer(data, sizeof(data)), 
     [this, shared_from_this()] ... 

? 或甚至以此:

socket.async_read_some(boost::asio::buffer(data, sizeof(data)), 
    [self = shared_from_this()](boost::system::error_code ec, std::size_t length) { 
     if (!ec) 
      self->do_write(length); 
}); 

回答

4

self对象被捕获到lambda中作为所有权令牌:只要lambda生存,令牌就会生存,并且对象不会被销毁。

捕获this是多余这里,但没有它,一个会写

if (!ec) 
    self->do_write(length); 

,而不是

if (!ec) 
    do_write(length); 

这是一样的

if (!ec) 
    this->do_write(length); 

因此,this是主要为了可读性而捕获。