單例模式前面已經說過了,下面說說單例模式的私有靜態成員_singleton的釋放
如果在類的析構行為中有必須的操作,比如關閉檔案,釋放外部資源,那麼上面所示的**無法實現這個要求。我們需要一種方法,正常地刪除該例項。
可以在程式結束時呼叫getinstance並對返回的指標呼叫delete操作。這樣做可以實現功能,但是不僅很醜陋,而且容易出錯。因為這樣的附加**很容易被忘記,而且也很難保證在delete之後,沒有**再呼叫getinstance函式。
乙個妥善的方法是讓這個類自己知道在合適的時候把自己刪除。或者說把刪除自己的操作掛在系統中的某個合適的點上,使其在恰當的時候自動被執行。
我們知道,程式在結束的時候,系統會自動析構所有的全域性變數。事實上,系統也會析構所有的類的靜態成員變數,就像這些靜態成員也是全域性變數一樣。利 用這個特徵,我們可以在單例類中定義乙個這樣的靜態成員變數,而它的唯一工作就是在析構函式中刪除單例類的例項。
#include #include using std::cout;
using std::endl;
class singleton
~autorelease()
}};public:
static singleton * getinstance()
private:
singleton()
~singleton()
private:
static singleton * _pinstance;
static autorelease _autorelease;
};singleton * singleton::_pinstance = getinstance();
singleton::autorelease singleton::_autorelease;
int main(void)
執行結果為:
singleton()
autorelease()
p1 = 0x172b010
p2 = 0x172b010
~singleton()
~autorelease()
第二種方法:
#include #include #include using std::cout;
using std::endl;
//第二種方法:餓漢式 + atexit函式
class singleton
return _pinstance;
} static void destroy()
private:
singleton()
~singleton()
private:
static singleton * _pinstance;
};singleton * singleton::_pinstance = getinstance();
int main(void)
singleton()
p1 = 0x245f010
p2 = 0x245f010
~singleton()
第三種方法:
#include #include #include #include using std::cout;
using std::endl;
//第三種方法: pthread_once函式 + atexit函式
class singleton
static void init()
static void destroy()
private:
singleton()
~singleton()
private:
static singleton * _pinstance;
static pthread_once_t _once;
};singleton * singleton::_pinstance = getinstance();
pthread_once_t singleton::_once = pthread_once_init;
int main(void)
singleton()
p1 = 0x19d9010
p2 = 0x19d9010
~singleton()
單例模式的自動釋放
一般來說,程式退出的時候,所有的資源都被 但是在使用檢測記憶體洩露的工具比如valgrind時會被檢測出來,可以理解為這是一種 假的記憶體洩漏 為此,這裡分別使用三種方法來避免這個問題。實現 1 include 2 using std cout 3 using std endl 45 class s...
單例模式需要釋放嗎
單例模式需要釋放嗎 1 這個問題我也想過,既然是單例,就是不管呼叫者什麼時候呼叫,你必須馬上給他返回乙個例項,所以,在整個程式的生命週期裡,他一直存在,所以不釋放也沒關係的,建議開始用arc,我也才開始用沒多久,感覺比之前的寫 爽多了 2 記得我還是個懵懂少年的時候查過這個問題.sof 告訴我 si...
C 單例模式物件釋放的問題
std mutex resource mutex class mycas 這是乙個單例類 私有化建構函式 private static mycas m instance 靜態成員變數 public static mycas getinstance return m instance class cg...