Singleton可算是最简单的模式,本文记述小鸡射手遇到的问题及反思。
对于Singleton,小鸡射手想能不能:
1. 将private static成员变量直接声明为Singleton类?
2. 将要调用的方法直接声明为static?
在项目中,采用VC++按方式1实现Singleton类,编译、链接一切OK。运行时却出现了内存方面的exception,经调试发现:static成员变量没有初始化!原来是在一个Singleton的构造函数中调用了另一个Singleton类,而另一个Singleton类还没有初始化。所以,采用方法1,当多个Singleton类之间在构造函数中有互相调用的话,可能发生错误。
对2也是一样,如果在一个Singleton的构造函数中调用了另一个Singleton的静态方法,也会由于初始化顺序因素导致的问题。另外,方法2还有一个缺陷就是不能将Singleton作为参数传递。
结论:
- 还是将Singleton实现为static Singleton类的指针
- 为了避免memory leak,可以增加类似auto_ptr的包装类。