Skip to content

一个进程空间内全局单例的框架(注册到独立外置的一个dll中),支持热加载/热卸载动态链接库。

License

Notifications You must be signed in to change notification settings

KondeU/GlobalSingleton

Repository files navigation

GlobalSingleton

一个进程空间内全局单例的框架 - 支持动态库热加载/热卸载

Windows使用注意事项:
1. 要求使用MD/MDd,而不是MT/MTd,保证exe和所有dll间使用同一个crtheap堆,否则
   exe和不同dll间都有各自的crtheap堆,而new和delete需要在同一堆中配套执行。
2. 慎用virtual,析构函数不能为virtual函数。因为当析构函数为virtual函数时,如果
   单例由dll1加载,而dll2在dll1卸载之后如果还在使用,那析构时调virtual的析构函
   数会去查虚函数表,而虚函数表是由dll1创建的,会引发崩溃。其他虚函数也涉及虚函
   数表,因此若要使用虚函数,那么除非能保证dll的卸载顺序,否则不要使用热卸载。
   事实上,全局单例的管理交由单例框架来实现后,析构函数是否使用virtual都不会产生
   泄漏,因为单例框架构造和析构时使用的都是具体的全局单例类,而不会是它们的基类。
3. 单例全为懒加载,直到GetReference的时候才真正实例化单例对象,需要注意全局单例
   没有保证多线程间安全,因此在单例实例化/动态库首次获取单例时都是线程不安全的。
   若在SingletonManager.cpp的Count/Obtain/Release函数中使用std::mutex加锁能够实现
   单例获取的安全,但实例化过程(创建过程)仍是线程不安全的。

C++版本要求:C++14 以上(MSVC v140 (VS2015) 以上,如果使用Visual Studio)。

About

一个进程空间内全局单例的框架(注册到独立外置的一个dll中),支持热加载/热卸载动态链接库。

Topics

Resources

License

Stars

Watchers

Forks