升压回声服务器实例和拉姆达
问题描述:
捕获此和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()
方法调用this
或self
?
在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);
});
?
答
self
对象被捕获到lambda中作为所有权令牌:只要lambda生存,令牌就会生存,并且对象不会被销毁。
捕获this
是多余这里,但没有它,一个会写
if (!ec)
self->do_write(length);
,而不是
if (!ec)
do_write(length);
这是一样的
if (!ec)
this->do_write(length);
因此,this
是主要为了可读性而捕获。