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