2013-03-31 69 views
4

假設這種單例模式的實現(當然,我們應該避免單例:它只是問題),我剛纔正在考慮創建靜態對象。當然,它是由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模式沒有按根本沒有提到刪除對象的問題,所以也許存在一些其他的方法?

+1

誰做這樣的單身人士?爲什麼不只是返回一個'靜態CC'? – Pubby

+0

我似乎錯過了c_ptr被分配了一個CC對象的行 – Arun

+0

是的,當然,改變了,謝謝 – 4pie0

回答

8

Singleton設計模式的一部分是它是堅不可摧的。

編輯:

有2個品種的單身相對於破壞性:

  1. 可破壞(他們死當應用程序確實)
  2. 不滅(他們死當機器一樣)

無論哪種方式,如果構建得當,一旦創建單例實例,它就會保留。這是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

+11

他們應該讓單身船飛船外殼... –

+0

我完全同意。讓我們把它帶上spacecraft.stackexchage.com –

+0

它是如何堅不可摧?不應該被稱爲泄漏而不是?這種情況下,其他應用程序可能仍然使用它? – 4pie0

4

經典單例模式不描述刪除方面。

但是,如果我必須這樣做,我會像下面這樣一個簡單的方法開始(它不是防呆):

1)創建/檢索singleton對象的靜態方法類似如createObject(),有一種破壞單體對象的靜態方法,如destructObject()

2)有一個計數器,用於統計系統中當前的對象數;

  • 它開始在0
  • createObject()呼叫,它通過遞增1
  • deleteObject()呼叫時,其減1。
    • 如果它達到0,則delete被調用來實際上銷燬對象
+0

與shared_ptr唯一的區別是計數器是全局的(在系統中不是單個應用程序使用這個單例)對嗎? – 4pie0

+0

該計數器也是單身人士喜歡的實際對象。 – Arun

3

我寧願不使用指針。

class Single 
{ 
private: 
    Single(); 

public: 
    Single& Instance() 
    { 
     static Single the_instance; 
     Return the_instance; 
    } 
}; 

此單將生活從時間Instance()被稱爲直到應用程序退出,並進行靜態物體的破壞。在這種情況下,單例對象的析構函數將被調用。

實際上,即使在原始示例中使用指針時,應用程序退出時操作系統也會回收內存。但是在這種情況下,對象的析構函數將會調用而不是