假设这个单例模式的实现(当然我们应该避免使用Singleton:这只是问题),我一直在考虑创建静态对象。它是由new
运算符在堆上创建的,当然,但这是如何被破坏的?在下面的例子中我们有一个泄漏,所以如何实现删除静态单例对象?如果采用please_delete()
公共接口,那么可以调用myC->please_delete()
还是有其他方法可以实现此目的?
class CC{
public:
static CC* cObj(){
if(c_ptr==NULL){
c_ptr=new CC();
return c_ptr;
}else return c_ptr;
}
int getValue(){return value_;}
void setValue(int val){value_=val;}
~CC(){cout<<"~CC";}
private:
CC():value_(12345){cout<<"CC";}
static CC* c_ptr;
int value_;
};
// Allocating and initializing CC's
// static data member. The pointer is being
// allocated - not the object itself.
CC *CC::c_ptr = 0;
int main(){
//Singleton pattern
CC* myC = CC::cObj();
cout<<myC->getValue();
return 0;
}
输出:CC12345
RUN SUCCESSFUL(总时间:67ms)
我注意到我们总是可以在shared_ptr
中声明单例静态实例和boost::shared_ptr<CC> bCptr(CC::cObj());
一样,但是Singleton模式根本没有提到删除对象的问题,所以可能存在其他一些方法?
答案 0 :(得分:8)
Singleton设计模式的一部分是它是坚不可摧的。
编辑:
有关破坏性的单体有两种:
无论哪种方式,如果构建正确,一旦创建了单例实例,它就会保留。这是对Singleton设计模式的主要批评之一。
以下是一些涉及模式可破坏性方面的参考文献。
http://nicolabonelli.wordpress.com/2009/06/04/singleton-a-mirage-of-perfection/ http://www10.informatik.uni-erlangen.de/Teaching/Courses/SS2009/CPP/altmann.pdf http://sourcemaking.com/design_patterns/singleton http://sourcemaking.com/design_patterns/to_kill_a_singleton
答案 1 :(得分:4)
经典的单例模式没有描述删除方面。
但是,如果我必须这样做,我会从一个简单的方法开始,如下所示(它不是万无一失的):
1)类似于创建/检索单例对象的静态方法,比如createObject()
,有一个静态方法来破坏单例对象,比如destructObject()
2)有一个计数器可以计算系统中当前的对象数量;
createObject()
来电时,它会增加1 deleteObject()
来电时,它会减1。
delete
被调用实际上破坏对象答案 2 :(得分:3)
我更喜欢不使用指针。
class Single
{
private:
Single();
public:
Single& Instance()
{
static Single the_instance;
Return the_instance;
}
};
此单例将在调用Instance()
时生效,直到应用程序退出并执行静态对象的销毁。在这种情况下,将调用单例对象的析构函数。
实际上,即使在原始示例中使用指针时,OS也会在应用程序退出时回收内存。但是在这种情况下,对象的析构函数将不被调用。