[英]how to delete singleton object
假設這個單例模式的實現(當然我們應該避免使用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
運行成功(總時間:67ms)
我注意到我們總是可以在shared_ptr
聲明單獨的靜態實例,就像使用boost::shared_ptr<CC> bCptr(CC::cObj());
但Singleton模式根本沒有提到刪除對象的問題所以可能存在其他一些方法?
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)類似於創建/檢索單例對象的靜態方法,比如createObject()
,有一個靜態方法來破壞單例對象,比如說destructObject()
2)有一個計數器,用於計算系統中當前的對象數量;
createObject()
調用上,它遞增1 deleteObject()
調用上,它減1。
delete
以實際銷毀該對象 我更喜歡不使用指針。
class Single
{
private:
Single();
public:
Single& Instance()
{
static Single the_instance;
Return the_instance;
}
};
這個單例將在調用Instance()
時Instance()
直到應用程序退出並執行靜態對象的銷毀。 在這種情況下,將調用單例對象的析構函數。
實際上,即使在原始示例中使用指針時,OS也會在應用程序退出時回收內存。 但是在這種情況下, 不會調用對象的析構函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.