ANSI C++ 中的 Singleton 實現說難不難,說容易也不容易,很多人寫 ANSI C++ 的 Singleton class 都有錯誤。這篇文章討論怎樣在 ANSI c++ 中寫 Singleton class, 希望對大家有幫助。
? 《設計模式》中把 Singleton 寫成返回指針:
class Singleton{ |
????? 相應的實現 cpp 文件是:
Singleton* Singleton::_instance; |
?
??? 將構造函數設計成 protected 的目的是防止在 class 外面 new ,有人可能會設計成 private ,如果考慮到有可能會繼承這個類的話,還是將構造函數設計成 protected 比較好,還需要加一個 virtual 析構函數。為了防止別人復制 Singleton 對象:
Singleton* pSingleton = Singleton::Instance(); |
???
但是這里存在的問題是,什么時候刪除 Singleton 對象?按照 C++ 的一個基本原則,對象在哪里創建就在哪里銷毀,這里還應該放一個
destroy 方法來刪除 Singleton 對象。如果忘了刪除就比較麻煩。Instance 函數還存在多線程同時訪問的加鎖問題。如果把
Instance 函數開始和結尾放上加鎖和解鎖,整個函數性能會下降很多。這不是一個好的設計。
??? 有一個小小的改動,可以避免忘了刪除
Singleton 對象帶來內存泄露的問題。那就是用 std:auto_ptr 來包含 Singleton 對象,定義一個class
static member auto_ptr 對象,在析構的靜態 auto_ptr 變量的時候時候自動刪除 Singleton
對象。為了不讓用戶 delete Singleton 對象,需要將析構函數由 public 變成 protected。以下是頭文件
SingletonAutoPtr.h :
#include <memory> |








