共享库中静态函数成员的销毁顺序——Boost.Serialization单例Bug咨询
Boost.Serialization 单例相关Bug的排查梳理
刚好最近在深挖Boost.Serialization里一个和单例有关的棘手Bug,把整理的信息和思路分享出来:
版本对应的问题表现
- Boost 1.65:官方修改了单例的实现逻辑,直接破坏了
is_destructed通知机制,结果就是程序退出或者卸载库的时候会触发段错误,属于挺要命的运行时崩溃问题。 - Boost 1.66:官方宣称修复了崩溃问题,但实际上是拆东墙补西墙——崩溃没了,却留下了内存泄漏的隐患,等于问题没彻底解决。
核心单例代码简化
涉及的单例模板可以简化成这样:
template<class T> struct singleton{ T& inst(){ static T t; return t; } };
初步的修复方向
目前摸索下来,改用静态成员函数变量的方式(或者说把静态实例的生命周期控制权从函数内转移到更可控的范围),能避开上述两个版本的坑。比如可以将单例实例改为类的静态成员,再配合手动的初始化/销毁逻辑,绕过Boost自带单例实现的生命周期陷阱。
内容的提问来源于stack exchange,提问作者Flamefire
相关产品推荐
相关产品推荐

