Singleton all in one

1.将default构造函数声明为私有的的。 
这保证了不被非法创建,当然,个人觉得,这不是单件的必然要求,只是为了保证单件安全性。如果你认为一个方法是私有的,那你不要在外部使用它就是了,某些一样很优雅的语言也使用这个约定来保护私有数据,当然,这是着力于小规模项目的语言的策略。

2.将copy构造函数定义为私有的。
这是容易忽视的一点,如果你不定义copy构造函数,编译器会帮你定义一个,自己声明一个私有的可以回绝编译器这个友好的帮助。

3.让instance回传引用。
如果回传指针,调用者可能有意无意的删除它,这是我们不希望看到的,回传引用可以避免这个问题。

4.atexit函数。
atexit是C提供的一个非常有用的函数,在程序结束的时候,通过atexit注册的方法可以被调用,而且调用依照atexit注册的FIFO顺序进行,只不过,在atexit注册的函数中再次注册atexit会出现不可预知的问题,据说C++标准已经着手修改了此事。但是,请对此保有一份警惕,因为你不知道你的编译器会干什么。

5.placement new在特定地址上构造新的对象的技术的思考。
关于placement new和构造对象的双重思考。

6.dead reference。
当referenced对象被析构后,如果继续调用reference,那还是会得到原先referenced对象所在的内存,只不过,那块内存上已物是人非。

7.policy的正交分解
正交分解的重要性已经提及,对于singleton而言,构造方式、销毁方式和线程安全是三个互不影响的方面,所以如此处理了singleton

template     <
    
class     T,
    template 
< class >      class  CreationPolicy     =  CreateUsingNew,
    template 
< class >      class  LifetimePolicy     =  DefaultLifetime,
    template 
< class >      class  ThreadingModel     =  SingleThread
>
class     SingletonHolder;

8.删除策略中的SetLongevity方法
SetLongevity每次都调用一次atexit,但是每次其实都是注册的同一个方法,这样只是保证多少次set就有多少次atexit-delete,并不保证顺序,可是在atext注册的方法被调用的时候,它进行了顺序删除,这也是SetLongevity的实现的技巧了。可以看到,这个策略只对new出来的对象有意义。而且,为了避免对象内存哪个最后删除的问题,使用realloc处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值