单例模式在动态库卸载时如何安全注销并销毁?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1277个文字,预计阅读时间需要6分钟。
在动态库卸载时,不会自动销毁,必须显式调用`FreeLibrary`,否则保留的静态指针将变为空指针,下次访问时将导致崩溃。
为什么动态库里的单例不能靠析构函数自动清理
动态库(DLL/so)加载后,其全局/静态对象的生命周期由操作系统管理:Windows 下 DLL 的全局对象析构函数只在 FreeLibrary 返回前、且 DLL 引用计数降为 0 时才被调用;但这个“析构时机”不可靠——若单例是通过 new 分配在堆上、仅靠静态指针持有(如懒汉式),析构函数根本不会触发该堆对象的 delete;更糟的是,若 DLL 被多次 LoadLibrary/FreeLibrary,静态变量可能被重复初始化或未重置,导致 getInstance() 返回已释放内存地址。
本文共计1277个文字,预计阅读时间需要6分钟。
在动态库卸载时,不会自动销毁,必须显式调用`FreeLibrary`,否则保留的静态指针将变为空指针,下次访问时将导致崩溃。
为什么动态库里的单例不能靠析构函数自动清理
动态库(DLL/so)加载后,其全局/静态对象的生命周期由操作系统管理:Windows 下 DLL 的全局对象析构函数只在 FreeLibrary 返回前、且 DLL 引用计数降为 0 时才被调用;但这个“析构时机”不可靠——若单例是通过 new 分配在堆上、仅靠静态指针持有(如懒汉式),析构函数根本不会触发该堆对象的 delete;更糟的是,若 DLL 被多次 LoadLibrary/FreeLibrary,静态变量可能被重复初始化或未重置,导致 getInstance() 返回已释放内存地址。

