C++ C++;Boost.Asio对象寿命
套接字的析构函数应该关闭套接字。但是异步后端可以处理这个问题吗?它会取消异步操作并调用处理程序吗?可能没有?为什么要使用C++ C++;Boost.Asio对象寿命,c++,boost-asio,C++,Boost Asio,套接字的析构函数应该关闭套接字。但是异步后端可以处理这个问题吗?它会取消异步操作并调用处理程序吗?可能没有?为什么要使用new创建套接字?它肯定不能正常工作。 如果确实要使用new创建套接字,则必须在程序结束时关闭并删除 这是一个样品,仅此而已 asio::io_service ioService; asio::ip::tcp::socket* socket = new asio::ip::tcp::socket(ioService); socket->async_connect(endp
new
创建套接字?它肯定不能正常工作。
如果确实要使用new创建套接字
,则必须在程序结束时关闭并删除
这是一个样品,仅此而已
asio::io_service ioService;
asio::ip::tcp::socket* socket = new asio::ip::tcp::socket(ioService);
socket->async_connect(endpoint, handler);
delete socket;
为什么要使用
new
创建套接字?它肯定不能正常工作。
如果确实要使用new创建套接字
,则必须在程序结束时关闭并删除
这是一个样品,仅此而已
asio::io_service ioService;
asio::ip::tcp::socket* socket = new asio::ip::tcp::socket(ioService);
socket->async_connect(endpoint, handler);
delete socket;
当套接字被破坏时,它将继续其服务。调用SocketService的函数时,它通过调用非抛出的
close()
来取消异步操作。已取消操作的处理程序将在io_服务
中发布以供调用,并出现boost::asio::error::operation_中止
错误
下面是一个完整的示例,演示了记录的行为:
#包括
#包括
无效句柄\u连接(常量boost::system::error\u代码和错误)
{
std::cout当套接字被销毁时,它将在其服务上运行。当调用SocketService的函数时,它通过调用非抛出的close()来取消异步操作
。取消操作的处理程序将在io\u服务
中发布以供调用,并出现boost::asio::error::operation\u中止
错误
下面是一个完整的示例,演示了记录的行为:
#包括
#包括
无效句柄\u连接(常量boost::system::error\u代码和错误)
{
std::cout我不是真的那样使用它。我正在围绕Asio编写线程安全包装。文档中缺少关于保证和未定义行为的信息,所以我只是试图探索它是如何隐藏在幕后的。@NFRCR好的,我不知道你隐藏的意图。谢谢你的评论。我不是真的那样使用它。我是在写线程Asio周围的安全包装。文档中缺少关于保证和未定义行为的信息,因此我只是试图探索这一切是如何在幕后进行的。@NFRCR好的,我不知道你隐藏的意图。谢谢你的评论。只是想进一步澄清一下。允许套接字的析构函数在句柄之前返回是正确的吗已调用r?因此处理程序必须保持不变。@NFRCR是。处理程序的生存期与套接字的生存期不耦合,操作将根据需要复制处理程序。如果处理程序绑定到非静态成员函数,则应用程序有责任保证它所属的实例绑定的生存期至少与处理程序的生存期一样长。在中使用的enable_shared_from_this
习惯用法是满足这一保证的一种方法。只是进一步证明一下。在调用处理程序之前允许套接字的析构函数返回正确吗?因此处理程序必须保持完整。@nfrcyes、 处理程序的生存期不与套接字的生存期耦合,操作将根据需要复制处理程序。如果处理程序绑定到非静态成员函数,则应用程序有责任确保绑定它的实例的生存期至少与handl的生存期一样长呃,在中使用的enable\u shared\u from\u这个
习惯用法是满足这一保证的一种方法。