async_resolve和async_connect参数的生存期
async_resolve and async_connect params lifetime
我想知道传递给上述方法的对象的生存期是多少。
异步解决
ip::basic_resolver::async_resolve(const query & q, ResolveHandler handler);
(1) 在调用处理程序之前,我是否需要保持解析程序处于活动状态?(是)
(2)async_resolve是否复制query
对象?(我正在传递在堆栈上创建的一个-是的)
{
boost::asio::ip::tcp::resolver::query query(host_, port_);
resolver_.async_resolve(query, );
}
(3) 处理程序中是否按值返回boost::asio::ip::tcp::resolver::iterator
?(是)
异步连接
template<..> void async_connect(basic_socket<Protocol, SocketService> & s,
Iterator begin, ComposedConnectHandler h);
(4)begin
是否通过值传递?(是)
(5)我需要保持resolver
的活力吗?(否)
使用Boost.Asio,一般规则是:
- 复制常量引用或值传递的参数。如果得到支持,它们可能会被移动
- 非常量引用传递的参数必须保持有效,直到同步操作完成或异步操作的处理程序被调用
当规则出现异常时,文档将指示它,例如boost::asio::async_write
的buffers参数的情况,在调用处理程序之前,该参数必须保持有效。
对于ip::basic_resolver
:
- 与其他服务对象一样,如果服务对象被未完成的异步操作破坏,那么异步操作处理程序将被
boost::asio::error::operation_aborted
调用。如果您不想管理服务对象的寿命,请使用shard_ptr
对其进行管理,并将shared_ptr
的副本绑定到处理程序中 -
对于
async_resolve
,query
对象通过常量引用传递,并最终复制到底层操作的构造函数(resolve_endpoint_op
)中。这也允许使用临时query
对象。{ typedef boost::asio::ip::tcp::resolver::query query; resolver_.async_resolve(query(host_, port_), ); }
-
async_resolve
期望处理程序满足ResolverHandler的要求。它记录了迭代器参数的取值。
对于boost::asio::async_connect
:
- 根据文档,begin参数是通过值传递的
resolver
不需要保持活动状态,因为迭代器具有查询结果的共享所有权。虽然不在文档中,但ip::basic_resolver_iterator
维护shared_ptr
到ip::basic_resolver_entry
对象的std::vector
。basic_resolver_entry
对象具有端点、主机名和服务名的成员变量
相关文章:
- GCC对可能有效的代码抛出init list生存期警告
- 在不复制临时对象的情况下延长其生存期
- 结束另一个线程中使用的对象的生存期
- "this"指针的值在对象的生存期内是否恒定?
- 创建具有全局生存期的 UObject
- C++17 和静态临时生存期的参考扩展
- 数组对象的生存期是否在重用其元素存储时结束?
- 共享指针生存期
- 具有空洞初始化的对象的生存期
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 指针引用的生存期(以 C++为单位)
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 全局静态生存期?他们会让你的程序崩溃吗?
- "std::function"的简单版本:函数对象的生存期?
- 您能否根据是否使用返回值来保证不同的生存期行为?
- 理解C++指针生存期/僵尸指针
- 有什么方法可以延长C++中临时对象的生存期吗