我在阅读boost :: asio :: async_read_until()时遇到了一个问题。我一直使用的服务器代码如下:
boost::asio::streambuf buffer;
boost::asio::async_read_until(socket_,buffer,DELIMITER,boost::bind(
&chat_session::handle_read_body,
shared_from_this(),
placeholders::error,
placeholders::bytes_transferred()
)
);
void chat_session::handle_read_body(const boost::system::error_code& error,std::size_t bytes_transferred)
{
FILE_LOG(logINFO)<<"Entry chat_session::handle_read_body\n";
FILE_LOG(logINFO)<<"Bytes Received:\t"<<bytes_transferred<<endl;
}
当我的客户端使用分隔符发送一些数据时,服务器会出现一个分段错误对话框,后台打开的文件是read_until.hpp。控件不会出现在handle_read_body()函数中。
请帮忙!
答案 0 :(得分:0)
shared_from_this(),
this
是你的问题 - 原谅双关语。
没有看到崩溃,可能会发生两件事之一:
a)您的代码将shared_from_this()
转换为从中获取指针的右值,然后共享对象将被解除,并且在回调排队后对象将被销毁,
b)回调处理程序正在尝试使用shared_from_this()
的值来填充this
,这是非法的(它不知道调用shared_from_this().get()
)
您可能需要尝试以下操作:
~chat_session()
{
LOG("~chat_session(%p)", this);
}
// ...
auto ptr = shared_from_this();
LOG("this=%p, shared=%p, cs=%p, aru", this, ptr, (chat_session*)ptr);
boost::asio::async_read_until(socket_,buffer,DELIMITER,boost::bind(
&chat_session::handle_read_body,
ptr,
placeholders::error,
placeholders::bytes_transferred()
)