簡體   English   中英

如何刪除單例對象

[英]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設計模式的一部分是它是堅不可摧的。

編輯:

在破壞性方面有兩種單體:

  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

經典的單例模式沒有描述刪除方面。

但是,如果我必須這樣做,我會從一個簡單的方法開始,如下所示(它不是萬無一失的):

1)類似於創建/檢索單例對象的靜態方法,比如createObject() ,有一個靜態方法來破壞單例對象,比如說destructObject()

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

  • 它從0開始
  • createObject()調用上,它遞增1
  • deleteObject()調用上,它減1。
    • 如果它達到0,則調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM