boost::asio::ip::tcp::socket
的析构函数到底是做什么的?即使在浏览Boost文档和源代码之后,如果我需要使用
socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
socket->close();
之前打电话
delete socket;
我是否需要手动关闭套接字,或者析构函数是否处理此问题?
答案 0 :(得分:6)
当套接字被销毁时,在销毁套接字期间,socket.close(ec)
将关闭 as-if 。
I / O对象(例如 mBrowseFrame.setOnFocusSearchListener(mOnFocusSearchListener);
)派生自basic_io_object
。在basic_io_object
destructor中,将在I / O对象的I / O服务上调用socket
,传入I / O对象的destroy()
实例&# 39;服务将运作。对于socket,将在满足SocketService类型要求的类型上调用implementation_type
,关闭底层套接字。在下面的文档中,destroy()
是套接字服务类的实例,a
是套接字服务类的b
的实例:
implementation_type
:[...]隐式取消异步操作,就像调用
一样a.destroy(b)
。
a.close(b, ec)
:如果
a.close(b, ec)
为true,则会导致任何未完成的异步操作尽快完成。取消操作的处理程序应传递错误代码a.is_open()
。发布:
error::operation_aborted
。
答案 1 :(得分:4)
不,你不需要关闭它。虽然这样做可能更干净,但如果您想报告协议关闭周围的任何错误。
析构函数只是/出现/是空的,这是Modern的一个好兆头 C ++:
答案 2 :(得分:3)
关于shutdown()的问题已经跳过了答案。从close()文档,“关于正常关闭连接套接字的可移植行为,在关闭套接字之前调用shutdown()”。
如果删除套接字是隐式关闭,则在删除之前仍然建议调用shutdown()。