async_read_until()中的SEG错误

时间:2015-05-25 09:43:31

标签: c++ boost segmentation-fault

我在阅读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()函数中。

请帮忙!

1 个答案:

答案 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()
                                                 )