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

来源:互联网 发布:linux中的echo命令 编辑:程序博客网 时间:2024/04/29 07:23
(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变量好。     


原创粉丝点击