我正在使用 Boost asio 打开几个套接字我使用一个集合,该集合具有指向具有所有套接字信息的自定义类的共享指针。这个类也有这样的handle_read
功能,async_receive
因为我需要对每个接收做不同的事情,我不能绑定额外的参数。
我遇到的问题是,当我关闭套接字时,我删除了对该指针的最后一个引用,因此在handle_read
没有任何有效引用的情况下调用该函数,然后代码就中断了。
void SocketsAPI::do_close(const SocketInfo socket)
{
log("do_close");
if (!socket.m_socket || !socket.m_socket->is_open()) {
return;
}
boost::system::error_code errorcode;
socket.m_socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both, errorcode);
if (errorcode) {
trace("Closing failed: ", errorcode.message());
}
socket.m_socket->close(errorcode);
if (errorcode) {
trace("Closing2 failed: ", errorcode.message());
}
mapType::iterator iter = sockets.find(socket.key);
if (iter != sockets.end()) {
sockets.erase (iter);
}
log("do_close end");
}
事实上,我不希望handle_read
调用该函数,但我无法避免它,而且在多线程实现(多个线程调用io_service.run()
)中更糟糕的是,handle_read
将在关闭仍在处理时调用,因此“this”对象将在处理程序的任何点被释放。