[英]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
。 当他们每个人都完成了所有操作或发生了一些错误时,他们reset
其shared_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.