You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

boost::asio回声服务器中boost::make_shared崩溃,std::make_shared正常

解决Boost::make_shared创建Enable_shared_from_this对象崩溃的问题

嘿,我之前在VS2017搭配老版本Boost时也碰到过类似的坑,来帮你拆解下问题和解决办法:

首先,你的核心问题很明确:用boost::make_shared创建继承自std::enable_shared_from_this<session>的session实例时触发未知异常崩溃,但换成std::make_shared就完全正常。

为什么会崩溃?

这本质是Boost 1.67版本的boost::make_shared和VS2017的标准库std::enable_shared_from_this实现存在兼容性bug。

具体来说,std::enable_shared_from_this依赖内部的弱引用指针来生成shared_ptr,而老版本的boost::make_shared在初始化这类对象时,没有正确适配VS2017标准库中enable_shared_from_this的内存布局或初始化逻辑,导致后续调用shared_from_this()时触发未定义行为(比如空指针访问、内存越界,最终表现为“未知异常”崩溃)。

可行的解决办法

针对你的场景,有几个靠谱的方案:

  • 继续用std::make_shared(最推荐)
    既然这个写法已经被验证能正常工作,完全可以保留。std::make_shared是C++标准的实现,和std::enable_shared_from_this的配合本来就更紧密,稳定性更高。

  • 升级Boost版本
    Boost在1.70及以后的版本中修复了不少和VS2017/2019标准库的兼容性问题,如果你能升级到较新的Boost版本(比如1.75+),boost::make_shared应该就能正常工作了。

  • 手动构造boost::shared_ptr(应急方案)
    如果一定要用Boost的智能指针,也可以绕开boost::make_shared,手动用new创建对象后封装成boost::shared_ptr:

    boost::shared_ptr<session>(new session(std::move(socket)))->start();
    

    不过这种写法不如make_shared高效(会多一次内存分配),所以只建议作为临时应急手段。

额外要注意的细节

  • 确认你的Boost库是用VS141(对应VS2017)编译的,而且项目的运行时库设置(比如MT/MD/MTd/MDd)要和Boost编译时的设置完全一致,否则也可能引发各种奇怪的异常。
  • 如果你后续把session的构造函数改成private,不管是boost::make_shared还是std::make_shared,都需要额外添加友元声明才能正常使用,这点别忘了。

内容的提问来源于stack exchange,提问作者YNX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:23:55