假设这种单例模式的实现(当然我们应该避免单例:这只是个问题),我一直在考虑创建静态对象。它是由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
运行成功(总时间:67ms)
我注意到确实我们总是可以在其中声明单例静态实例shared_ptr
,boost::shared_ptr<CC> bCptr(CC::cObj());
但是单例模式根本没有提到删除对象的问题,所以也许存在其他方法?