单件模式中拷贝构造函数也需要私有化

(1)
不论是通过1.在GetInstance内申请局部static变量返回引用的方式还是,2.在GetInstance内部new出来存到static成员变量指针中,都有必要对拷贝构造函数也私有化,不然c++会为类自动生成公有的拷贝构造函数。

比如你在程序中:
1.
Singleton sg = Singleton::GetInstance();
2.
Singleton sg = *Singleton::GetInstance();

看似Singleton sg是调用构造函数,应该编译时就报错,事实上调用的拷贝构造函数,编译时什么错都不报。一时头脑发昏就会写出这样的句子了。

所以有必要对其拷贝构造函数也写一个私有化版本的。
(2)
    写一个小程序,new一个对象,输出其地址,然后不手动销毁。开这个exe一次,关一次,然后再开,这个对象分配到相同地址的。然而事实上这并不能说明上一次的对象被自动销毁了没驻留在内存中,因为两次程序运行输出的是逻辑地址,自然一直一样。
    如果不考虑手动销毁new和malloc,其实在程序结束后,其内存也是会自动被操作系统回收的。new忘了销毁吃内存主要是针对长时间开着不关闭的程序,而且那些程序吃内存是因为某一个函数内反复new对象不销毁才会增长内存消耗。对于Singleton来说占的内存是一直就那么一个不会增长的。也就是说对于方法2,不考虑销毁那个static指针指向的 Singleton对象也是可以的。      
    但是有个前提条件。因为程序关闭操作系统只会回收内存,而不会调用类的析构函数。如果你所写的Singleton类中析构函数没有做任何事情是可以不考虑销毁的。但是如果析构函数中有delete成员变量或序列话之类的事情,就必须销毁。
(3)
    《设计模式》: 使用全局/静态对象的实现方法还有另一个(尽管很小)的缺点,它使得所有单件无论用到与否都要被创建。使用静态成员函数避免了所有这些问题。
    《More Effective C++》: 「class拥有一个static对象」的意思是,纵使从未被用到,它也会被构造(及析构)。相反地「函数拥有一个static对象」的意思是,此对象在函数第一次被调用时才产生。
    避免创建不被使用的对象
     使用new指针的方式还是会占用一个指针的空间。


所以还是使用方法1的函数局部static变量好。     


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值