單例模式的記憶體釋放

2021-07-30 22:26:50 字數 2279 閱讀 6633

單例模式前面已經說過了,下面說說單例模式的私有靜態成員_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...