,对于如何来销毁此对象则只字不提。但是对象生命的管理对于c++程序员来说是多么的重要呀。或许singleton只
是属于创建模式的一种,大师们认为在这里不应涉及到“销毁模式”。
有人认为sinleton是应该在程序的退出的时候销毁的。但是退出应该是在什么时候呢。
请看如下代码:
假设是按设计模式里的方式来写一个对象singlton对象。
class singlton
{
private:
static singlton * _insatnce;
singlton()
{
cout<<"object is ["<<this<<"] do< construction"<<endl;
}
public:
~singlton()
{
cout<<"object is ["<<this<<"] do destruction>"<<endl;
_insatnce = 0;
}
static singlton * getsinglton()
{
if(_insatnce)
return _insatnce;
_insatnce = new singlton;
return _insatnce;
}
void dosomething()
{
cout<<"object is ["<<this<<"] do something"<<endl;
}
};
singlton * singlton::_insatnce = null;
void foo(int i)
{
/*
程序体
*/
if(i)
singlton::getsinglton()->dosomething();
/*
程序体
*/
}
int main()
{
/*
void ;
程序体
*/
foo(1)
// if(singlton::_insatnce)
// singlton::getsinglton(); 不能编译
delete singlton::getsinglton();
}
事实上如果在singlton某次运行根本就没有调用过foo(1)而只是调用了foo(0),但是还必
须得在最后程序退出时调用实际上这时候调用getsinglton()来建立对象马上就被删除了
。这是完全没有必要也是浪费的。想在程序执行时使用判断语句也是行不通的。这样的实
现还是可以改进的,使用在singlton中再增加一个静态的成员函数checkexistinstance来判
断对象是否存在,可以提高效率。但这样又给对象增加了接口,增加了代码维护的开销。
但是对象在程序结束时你并不清楚是不是真的不再需要此对象了。我们再修改代码如下。
class singlton
{
private:
static singlton * _insatnce;
singlton()
{
cout<<"object is ["<<this<<"] do< construction"<<endl;
}
public:
~singlton()
{
cout<<"object is ["<<this<<"] do destruction>"<<endl;
_insatnce = 0;
}
static singlton * getsinglton()
{
if(_insatnce)
return _insatnce;
_insatnce = new singlton;
return _insatnce;
}
void dosomething()
{
cout<<"object is ["<<this<<"] do something"<<endl;
}
};
singlton * singlton::_insatnce = null;
void foo(int i)
{
/*
程序体
*/
if(i)
singlton::getsinglton()->dosomething();
/*
程序体
*/
}
class testsingleton
{
public:
testsingleton()
{
singlton::getsinglton()->dosomething();
}
~testsingleton()
{
singlton::getsinglton()->dosomething();//此处出现内存泄露
}
};
testsingleton _test;
int main()
{
/*
void ;
程序体
*/
foo(1);