繁体   English   中英

带有 shared_ptr 的处理程序中的分段错误

[英]Segmentation fault in handlers with shared_ptr's

我正在尝试制作一个仅适用于一次应用程序执行中的第一个会话的代理。 它捕获SIGSEGV试图处理第二个。

它的工作方式如下:

  • 客户端连接
  • 代理连接到终端服务器(每个会话的唯一连接)
  • 代理将数据发送到服务器,从服务器获取处理过的数据并将处理过的数据发送到客户端
  • 代理断开与服务器和客户端的连接

问题是当我们启动应用程序并且第一个客户端尝试使用代理时,它工作正常(让客户端始终连接到代理,例如第一个获取其数据,断开连接,然后才连接第二个)。 但是当第二个在此之后尝试连接时,执行甚至无法到达handleAccept并在atomicity.h __atomic_add函数中捕获SIGSEGV (我在 Linux 中工作)。

我无法理解我错误地制作处理程序,错误地使用shared_ptr ,或两者兼而有之。

run在创建Proxy对象后被调用一次,以使其接受和处理客户端连接:

void Proxy::run() // create the very first session and keep waiting for other connections
{
    auto newSession = std::make_shared<Session>(ioService_);

    acceptor_.async_accept(
        newSession->getClientSocket(),
        [&](const boost::system::error_code &error) // handler is made according to boost documentation
        {
            handleAccept(newSession, error);
        }
    );

    ioService_.run();
}

handleAccept做几乎相同的事情,但也使会话开始在客户端和终端服务器之间传输数据:

void Proxy::handleAccept(std::shared_ptr<Session> session, const boost::system::error_code &error) // handle the new connection and keep waiting other ones
{
    if (!error)
    {
        session->connectToServer(serverEndpoint_);
        session->run(); // two more shared_ptr's to session are appeared here and we just let it go (details are further)
    }

    auto newSession = std::make_shared<Session>(ioService_);

    acceptor_.async_accept(
        newSession->getClientSocket(),
        [&](const boost::system::error_code &error)
        {
            handleAccept(newSession, error);
        }
    );
}

Session包含两个Socket对象(服务器和客户端),每个对象都有shared_ptr 当他们每个人都完成了所有操作或发生了一些错误时,他们resetshared_ptr reset为 session 以使其被释放。

为什么在 handleAccept(...) 中通过引用使用/捕获局部变量?:

 acceptor_.async_accept(
        newSession->getClientSocket(),
        [&](const boost::system::error_code &error)
        {
            handleAccept(newSession, error);
        }
    );

您想使用:

 acceptor_.async_accept(
        newSession->getClientSocket(),
        [this, newSession](const boost::system::error_code &error)
        {
            handleAccept(newSession, error);
        }
    );

函数完成后将运行 lambda,在此之前将销毁局部变量 newSession。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM