to zenny_chen:
你的方法有效率问题。只要使用了你的类,这个静态对象都会被创建,无论该对象是否被用户使用。如果该对象的构造和析构十分费时的话,这样的方法会使效率大大降低。况且你的方法也并不能保证多线程安全。你怎么知道静态的instance在构造的时候没有别的线程正在调用GetInstance函数?
===========================================================================
如果你的应用程序指明了一个接收到一个消息,由专门一个任务相应析构这个singleton实例,可以显式地调用其析构函数:Singleton::GetInstance().~Singleton();
===========================================================================
如果应用程序没有用消息怎么办?就算使用了消息,你怎么知道其它线程不需要Singleton对象了?万一程序非正常退出怎么办(比如遇到未处理的异常或者非法操作)?
===========================================================================
而Jim_King_2000你的方法也有多线程问题。
===========================================================================
1、我真的很希望这是我的方法。可惜现实不是这样。这个方法属于Scott Meyers。
2、这个方法是实现singleton的基础。很多种singleton实现(如相互依赖的singleton,多线程下的singleton等等)都是依据这个方法实现的。
3、很多实现在一开始的时候并不考虑多线程。等到单线程的实现方法出来以后,再扩展到多线程上面或者由用户自行加锁。STL也并不是多线程的。但这并不影响使用,你自己加锁就是了。
所以说singleton里面不用new并不是因为多线程。而是没有必要用new。建议你也翻翻《Modern C++ Design》。里面有多线程singleton的实现。