假設這種單例模式的實現(當然,我們應該避免單例:它只是問題),我剛纔正在考慮創建靜態對象。當然,它是由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());
但Singleton模式沒有按根本沒有提到刪除對象的問題,所以也許存在一些其他的方法?
誰做這樣的單身人士?爲什麼不只是返回一個'靜態CC'? – Pubby
我似乎錯過了c_ptr被分配了一個CC對象的行 – Arun
是的,當然,改變了,謝謝 – 4pie0