Singleton设计模式
我们知道,Singleton设计模式要求一个类class只能有一个实例instance存在,下面用C++来实现:
- #include<iostream>
- #include<string>
- using namespace std;
-
- class Singleton{
- public:
- static Singleton* getInstance(){
- cout<<"Singleton::getInstance"<<endl;
- if(!sg){
- sg = new Singleton(); //创建实例,但在哪里释放呢?
- }
- return sg;
- }
-
- private:
- Singleton(){ //构造函数声明为私有函数
- cout<<"Singleton::Constructor"<<endl;
- }
- static Singleton *sg; //私有静态变量
- };
- //初始化静态变量sg为0,不指向任何对象
- Singleton* Singleton::sg = NULL;
-
- int main(){
- Singleton *sg = Singleton::getInstance();
-
- return 0;
- }
代码说明:将构造函数声明为私有函数,即我们不能通过构造函数来初始化一个对象,而只能通过getInstance函数来创建一个类的实例,在该函数中,new了一个对象,却没有对应的delete语句,这将引起内存泄漏。
下面采用auto_ptr来解决内存泄漏问题:
- class Singleton{
- public:
- static auto_ptr<Singleton> getInstance(){
- cout<<"Singleton::getInstance"<<endl;
- if(!sg.get()){ //判断s所指对象是否为空
- auto_ptr<Singleton> temp(new Singleton); //创建实例
- sg = temp;
- }
- return sg;
- }
-
- private:
- Singleton(){ //构造函数声明为私有函数
- cout<<"Singleton::Constructor"<<endl;
- }
- static auto_ptr<Singleton> sg; //私有静态变量
- };
- //初始化静态变量sg,此时sg不指向任何对象
- auto_ptr<Singleton> Singleton::sg;
-
- int main(){
- auto_ptr<Singleton> s(Singleton::getInstance()); //创建实例s
-
- return 0;
- }
结果:
- Singleton::getInstance
- Singleton::Constructor
阅读(622) | 评论(0) | 转发(0) |