大括号初始化shared_ptr致Asio TCP连接异常关闭问题
问题分析与解决
问题根源
你遇到的问题是C++初始化语法的歧义导致的:
- 使用大括号初始化
auto conversation_ptr{shared_from_this()};时,clang++3.4会将其推导为std::initializer_list<std::shared_ptr<Conversation>>类型,而非预期的std::shared_ptr<Conversation>。 - 异步操作的完成处理器捕获的是这个初始化列表,而非持有Conversation实例的智能指针,无法延长Conversation的生命周期,导致实例提前销毁,Asio异步操作因对象已析构触发“Operation aborted”错误。
解决方案
改用小括号进行直接初始化:
auto conversation_ptr(shared_from_this());
这种写法会明确推导为std::shared_ptr<Conversation>类型,异步回调捕获该智能指针后,会维持Conversation实例的生命周期直到异步操作完成,避免提前销毁的问题。
补充说明
在C11及早期标准中,大括号初始化的类型推导规则存在边缘情况,clang3.4作为较老的编译器,优先将此类语法推导为std::initializer_list。后续C标准(如C17)对auto大括号初始化的推导规则做了调整,但在你使用的旧环境下,必须注意这种语法差异。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

