文章:http://www.lilu.name/Html/diannaojishu/2010-09/003468.html 中介绍了三种单例设计模式:动态、静态和可配置。然而这三种模式有一个共同的特点就是都使用了常驻内存的静态变量:静态成员变量或静态局部变量。当单例占用了大量内存且不经常使用时,以上三种模式都不适用;反之,如果单例占用内存较小或经常使用,则可以采用上述模式。针对第一种情况,本文给出了如下动态单例设计模式。
基本思路:使用引用计数(参考c++沉思录中的句柄类)+save/load/clear实现。
适用情况:单例占用了大量内存且不经常使用时
优 点:1、单例特性;2、代理内存管理,用户无需考虑内存管理问题;
缺 点:1、需要额外空间用于保存引用计数;2、需要外存保存单例对象,因此需要占用一部分外存空间。
具体实现:
说明:关于上述代码的改进
1.《Effective C++》中的条款4中提到一个“跨编译单元之初始化次序”问题,并给出了解决办法“以local static对象替换 non-local static ",本文开始连接的文章中的动态单例设计模式考虑到了这一点。注:虽然本例中使用的是私有静态成员变量,但是仍然不能排除跨编译单元的引用,因为“member函数和friend函数还是可以调用你的private变量”。
2.线程安全问题。《Effective C++》也有改进方案,待完善。