單例模式的自動釋放

2021-09-24 18:40:34 字數 2885 閱讀 9954

一般來說,程式退出的時候,所有的資源都被**,但是在使用檢測記憶體洩露的工具比如valgrind時會被檢測出來,可以理解為這是一種「假的記憶體洩漏」。為此,這裡分別使用三種方法來避免這個問題。

**實現:

1 #include 

2 using std:

:cout;

3 using std:

:endl;

45 class signalton

61415~

autorelease()

1622}23

};24 public:

25static signalton *

getinstance()

2631

return _pinstance;32}

3334

void

destroy()

3539

40void

print()

const

4144

4546 private:

47signalton()

48~signalton()

4950 private:

51static signalton * _pinstance;

52static signalton _autorelease;53}

;5455//signalton *signalton:: _pinstance=nullptr;//餓漢模式

56 signalton *signalton:

: _pinstance=signalton:

:getinstance()

;//飽漢模式

5758 signalton signalton:

: _autorelease;

5960

intmain()

61

#include

intatexit

(void

(*function)

(void))

;

功能:註冊終止函式,即main函式結束之後呼叫。

用法:接受乙個無參的函式。exit呼叫這些註冊函式的順序與它們登記時候的順序相反。同乙個函 數如若登記多次,則也會被呼叫多次。

**實現:

1 #include 

2 #include

3 using std:

:cout;

4 using std:

:endl;

56 class signalton

716return _pinstance;17}

1819

static

void

destroy()

2024

25void

print()

const

2629

3031 private:

32signalton()

33~signalton()

3435 private:

36static signalton * _pinstance;37}

;3839//signalton *signalton:: _pinstance=nullptr;//餓漢模式

40 signalton *signalton:

: _pinstance=signalton:

:getinstance()

;//飽漢模式

4142

intmain()

43

#include

intpthread_once

(pthread_once_t *once_control,

void

(*init_routine)

(void

));

功能:本函式使用初值為pthread_once_init的once_control變數保證init_routine()函式在多執行緒執行序列中僅執行一次。使用該函式保證了多執行緒安全。

1 #include 

2 #include

3 #include

4 using std:

:cout;

5 using std:

:endl;

67 class signalton

815//init若不被宣告為靜態型別,則第乙個引數為this指標,便不滿足pthread_once傳入無參函式的要求

16static

void

init()

1721

22static

void

destroy()

2327

28void

print()

const

2932

3334 private:

35signalton()

36~signalton()

3738 private:

39static signalton * _pinstance;

40static pthread_once_t _once;41}

;4243//signalton *signalton:: _pinstance=nullptr;//餓漢模式

44 signalton *signalton:

: _pinstance=nullptr;

//飽漢模式

45 pthread_once_t signalton:

:_once=pthread_once_init;

4647

intmain()

48

前兩種方法都是可以跨平台的,第三種方法具有平台相關性。

c 單例模式的自動釋放問題

1.巢狀類 靜態物件 include using std cout using std endl class singleton return pinstance private class autorelease autorelease private singleton singleton pr...

C 基礎之單例模式自動釋放

個人學習筆記 之前的介紹過關於單例模式的例子,其中物件是由 pinstance指標來儲存,通過new建立的物件並沒有進行釋放,是因為單例模式之後沒有其他 需要執行,程式會立馬結束,作業系統會自行 相關資源,但對於後面有相關 需要執行的程式來說,這種操作就會造成記憶體洩漏。有沒有什麼方式可以讓物件自動...

單例模式的記憶體釋放

單例模式前面已經說過了,下面說說單例模式的私有靜態成員 singleton的釋放 如果在類的析構行為中有必須的操作,比如關閉檔案,釋放外部資源,那麼上面所示的 無法實現這個要求。我們需要一種方法,正常地刪除該例項。可以在程式結束時呼叫getinstance並對返回的指標呼叫delete操作。這樣做可...