關於C++單件模式釋放對象

http://blog.csdn.net/windboyzsj/article/details/2790485ios

最近接觸的一個項目要用到單件模式,我像往常同樣噠噠(敲擊鍵盤ing)一個單件模式的典型結構很快就出如今個人面前: c++

  1. class Singleton 
  2. public: 
  3. ~Singleton(){} 
  4. static Singleton* Instance() 
  5.   if (_instance == NULL) 
  6.   { 
  7.    _instance = new Singleton(); 
  8.   } 
  9.   return _instance; 
  10. private: 
  11. Singleton(){} 
  12. static Singleton* _instance; 
  13. }; 
  14. Singleton* Singleton::_instance = NULL;

 

不知道爲何,此次忽然以爲new這個單詞太耀眼了,熟悉c++的程序員都知道,有new就離不開delete,既然單件模式共用一個實例,那麼這個實例何時釋放呢。帶着好奇我在它的析構函數加了個打印語句,但因爲new操做是在堆裏分配內存,估計它的析構函數不會被調用,而試驗結果確實如此。這樣一來那單件模式的析構函數不是徹底廢了嗎,若是這個單件類還有指針成員用new分配了空間那又應該在哪裏釋放?單件的實例又應該如何釋放。固然,咱們能夠在程序退出時經過 delete Singleton::Instance(); 來釋放內存並觸發析構函數。但這樣一來,寫好的類給別人用時就要叮囑別人,用完後必定要釋放- - !,再說別人不必定記得...有沒有一種機制讓單件模式自動釋放?百度,google好久,發現關注這個問題的寥寥無幾,但仍是給我找到了一篇文章讓我再次領略C++的靈活。按此文章大概把代碼修改以下; 程序員

 

  1. class Singleton 
  2. public: 
  3. ~Singleton(){} 
  4. static Singleton* Instance() 
  5.   if (_instance == NULL) 
  6.   { 
  7.    _instance = new Singleton(); 
  8.   } 
  9.   return _instance; 
  10. private: 
  11. Singleton(){} 
  12. static Singleton* _instance; 
  13. class Cleaner 
  14. public: 
  15.   Cleaner(){} 
  16.   ~Cleaner() 
  17.   { 
  18.    if(Singleton::Instance()) 
  19.    delete Singleton::Instance(); 
  20.   } 
  21. }; 
  22. static Cleaner clr; 
  23. }; 
  24. Singleton* Singleton::_instance = NULL; 

 

事先聲明我用VC6.0編譯上面的代碼(固然我有加一些測試代碼)發現,clr並無實例化,固然也就是沒有析構了,暫時不清楚爲何,但這裏的設計倒是很值得品味。它經過一個內嵌類和一個靜態成員來實現了自動釋放的機制,至關於爲單件加了個垃圾回收器。整個設計最巧妙的地方在於static Cleaner clr;這個聲明,因爲是靜態成員,系統會在棧裏分配內存,回收工做也就由系統自動完成了。這個思路另我想起了經過靜態變量來實現類的靜態構造函數,他們都有殊途同歸之處。至於私有的內嵌類主要是防止單件類的專用垃圾筒被打擾... 

雖然上面代碼沒有達到目的,但根據他的思路,能夠作一下調整,把Cleaner的實例化延遲,下面貼出整個測試代碼,一下代碼在VC6編譯經過。 函數

 

  1. #include <iostream.h> 
  2. class Singleton 
  3. public: 
  4. ~Singleton(){cout<<"singleton deconstruct"<<endl;} 
  5. static Singleton* Instance() 
  6.   if (_instance == NULL) 
  7.   { 
  8.    _instance = new Singleton(); 
  9.    static Cleaner cl; //延遲到這裏 
  10.   } 
  11.   return _instance; 
  12. void Print(char* str) 
  13.   cout<<"singleton print:"<<str<<endl; 
  14. private: 
  15. Singleton(){cout<<"singleton construct"<<endl;} 
  16. static Singleton* _instance; 
  17. class Cleaner 
  18. public: 
  19.   Cleaner(){cout<<"cleaner construct"<<endl;} 
  20.   ~Cleaner() 
  21.   { 
  22.    cout<<"cleaner deconstruct"<<endl; 
  23.    if(Singleton::Instance()) 
  24.    delete Singleton::Instance(); 
  25.   } 
  26. }; 
  27. }; 
  28. Singleton* Singleton::_instance = NULL; 
  29. int main(int argc, char* argv[]) 
  30. Singleton::Instance()->Print("print 1"); 
  31. Singleton::Instance()->Print("print 2"); 
  32. return 0; 
  33. }
相關文章
相關標籤/搜索