锘??xml version="1.0" encoding="utf-8" standalone="yes"?>精品永久久福利一区二区,久久99精品久久只有精品,狠狠色丁香久久婷婷综合图片 http://www.shnenglu.com/ant/category/5113.htmlThe dreams in which I'm dying are the best I've ever had...zh-cnWed, 21 May 2008 06:41:35 GMTWed, 21 May 2008 06:41:35 GMT60闈炲畬緹嶤++ Singleton瀹炵幇[2]http://www.shnenglu.com/ant/archive/2007/09/07/31786.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 07 Sep 2007 15:22:00 GMThttp://www.shnenglu.com/ant/archive/2007/09/07/31786.htmlhttp://www.shnenglu.com/ant/comments/31786.htmlhttp://www.shnenglu.com/ant/archive/2007/09/07/31786.html#Feedback13http://www.shnenglu.com/ant/comments/commentRss/31786.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31786.html4.瑙e喅澶氱嚎紼嬮棶棰?br />涓婁竴綃囧疄鐜扮殑Singleton鍙兘鍦ㄥ崟綰跨▼鐜涓嬌鐢紝鍦ㄥ綰跨▼鐜涓細鍑虹幇寰堝闂錛岀湅Instance()瀹炵幇浠g爜錛?br />
1static聽Singleton&聽Instance()聽{
2聽聽聽聽if聽(0==聽_instance)聽{聽//1

3聽聽聽聽聽聽聽聽_instance聽=new聽Singleton();聽//2
4聽聽聽聽聽聽聽聽atexit(Destroy);
5
聽聽聽聽}
6聽聽聽聽return*_instance;聽//3

7}
鑰冭檻濡備笅鎯呭喌錛氱嚎紼嬩竴璋冪敤Instance()錛岃繘鍏?/1錛? == _instance 榪斿洖true錛岀嚎紼嬩竴浜庢槸榪涘叆//2銆傝繖鏃跺欑嚎紼嬩竴琚寕璧鳳紝綰跨▼浜屽紑濮嬫墽琛岋紝綰跨▼浜岃皟鐢↖nstance()錛岃繘鍏?/1錛屽彂鐜? == _instance 浠嶇劧榪斿洖true錛岀嚎紼嬩簩浜庢槸涔熻繘鍏?/2錛岀嚎紼嬩簩緇х畫鎵ц鍒?/3鐩村埌榪斿洖銆傝繖鏃跺欑嚎紼嬩竴琚敜閱掞紝緇х畫浠?/2寮濮嬫墽琛岋紝榪欏皢浼氳鐩栫嚎紼嬩簩鍒涘緩鐨刜instance錛岀嚎紼嬩竴緇х畫鎵ц鍒?/3鐩村埌榪斿洖...

瑙e喅鏂規硶寰堢畝鍗曪紝寮曞叆鐩稿叧鍚屾瀵硅薄(synchronization object)灝辮浜嗭紝渚嬪鍦╳in32騫沖彴涓嬪彲浠ュ涓嬪疄鐜幫細
synobj.h
聽1#ifndef聽SYNOBJ_H
聽2
#define聽SYNOBJ_H
聽3

聽4#include聽<windows.h>
聽5
聽6#define聽CLASS_UNCOPYABLE(classname)聽\
聽7聽聽聽聽private
:聽\
聽8聽聽聽聽classname(const聽classname&
);聽\
聽9聽聽聽聽classname&聽operator=(const聽classname&
);
10

11class聽Mutex聽{
12
聽聽聽聽CLASS_UNCOPYABLE(Mutex)
13public
:
14聽聽聽聽Mutex()聽:_cs()聽{聽InitializeCriticalSection(&
_cs);聽}
15聽聽聽聽~Mutex()聽{聽DeleteCriticalSection(&
_cs);聽}
16聽聽聽聽void聽lock()聽{聽EnterCriticalSection(&
_cs);聽}
17聽聽聽聽void聽unlock()聽{聽LeaveCriticalSection(&
_cs);聽}
18private
:
19
聽聽聽聽CRITICAL_SECTION聽_cs;
20
};
21

22class聽Lock聽{
23
聽聽聽聽CLASS_UNCOPYABLE(Lock)
24public
:
25聽聽聽聽explicit聽Lock(Mutex&
聽cs)聽:_cs(cs)聽{聽_cs.lock();聽}
26聽聽聽聽~
Lock()聽{聽_cs.unlock();聽}
27private
:
28聽聽聽聽Mutex&
聽_cs;
29
};
30

31#endif/*SYNOBJ_H*/

鏈変簡鍚屾瀵硅薄寰堝鏄撳氨鑳藉鍐欏嚭濡備笅浠g爜錛?br />singleton.h
聽1#ifndef聽SINGLETON_H
聽2
#define聽SINGLETON_H
聽3

聽4#include聽"synobj.h"
聽5
聽6class聽Singleton聽{
聽7public
:
聽8聽聽聽聽static聽Singleton&聽Instance()聽{聽//聽Unique聽point聽of聽access

聽9聽聽聽聽聽聽聽聽Lock聽lock(_mutex);
10聽聽聽聽聽聽聽聽if聽(0==
聽_instance)聽{
11聽聽聽聽聽聽聽聽聽聽聽聽_instance聽=new
聽Singleton();
12聽聽聽聽聽聽聽聽聽聽聽聽atexit(Destroy);聽//聽Register聽Destroy聽function

13聽聽聽聽聽聽聽聽}
14聽聽聽聽聽聽聽聽return*
_instance;
15
聽聽聽聽}
16聽聽聽聽void
聽DoSomething(){}
17private
:
18聽聽聽聽staticvoid聽Destroy()聽{聽//聽Destroy聽the聽only聽instance

19聽聽聽聽聽聽聽聽if聽(聽_instance聽!=0聽)聽{
20
聽聽聽聽聽聽聽聽聽聽聽聽delete聽_instance;
21聽聽聽聽聽聽聽聽聽聽聽聽_instance聽=0
;
22
聽聽聽聽聽聽聽聽}
23
聽聽聽聽}
24聽聽聽聽Singleton(){}聽//聽Prevent聽clients聽from聽creating聽a聽new聽Singleton

25聽聽聽聽~Singleton(){}聽//聽Prevent聽clients聽from聽deleting聽a聽Singleton
26聽聽聽聽Singleton(const聽Singleton&);聽//聽Prevent聽clients聽from聽copying聽a聽Singleton
27聽聽聽聽Singleton&聽operator=(const聽Singleton&);
28private
:
29聽聽聽聽static
聽Mutex聽_mutex;
30聽聽聽聽static聽Singleton聽*_instance;聽//聽The聽one聽and聽only聽instance

31};
32

33#endif/*SINGLETON_H*/

singleton.cpp
1#include聽"singleton.h"
2
3Mutex聽Singleton::_mutex;
4Singleton*聽Singleton::_instance聽=0;
鐜板湪鐨凷ingleton铏界劧澶氱嚎紼嬪畨鍏紝鎬ц兘鍗村彈鍒頒簡褰卞搷銆備粠Instance()涓彲浠ョ湅鍒幫紝瀹為檯涓婁粎浠呭綋0 == _instance涓簍rue鏃舵墠闇瑕丩ock銆備綘寰堝鏄撳氨鍐欏嚭濡備笅浠g爜錛?br />
1static聽Singleton&聽Instance()聽{
2聽聽聽聽if聽(0==
聽_instance)聽{
3
聽聽聽聽聽聽聽聽Lock聽lock(_mutex);
4聽聽聽聽聽聽聽聽_instance聽=new
聽Singleton();
5
聽聽聽聽聽聽聽聽atexit(Destroy);
6
聽聽聽聽}
7聽聽聽聽return*
_instance;
8}
浣嗘槸榪欐牱榪樻槸浼氫駭鐢熺珵浜夋潯浠?race condition)錛屼竴縐嶅箍涓轟漢鐭ョ殑鍋氭硶鏄嬌鐢ㄦ墍璋撶殑Double-Checked Locking錛?br />
聽1static聽Singleton&聽Instance()聽{
聽2聽聽聽聽if聽(0==
聽_instance)聽{
聽3
聽聽聽聽聽聽聽聽Lock聽lock(_mutex);
聽4聽聽聽聽聽聽聽聽if聽(0==
聽_instance)聽{
聽5聽聽聽聽聽聽聽聽聽聽聽聽_instance聽=new
聽Singleton();
聽6
聽聽聽聽聽聽聽聽聽聽聽聽atexit(Destroy);
聽7
聽聽聽聽聽聽聽聽}
聽8
聽聽聽聽}
聽9聽聽聽聽return*
_instance;
10}
Double-Checked Locking鏈哄埗鐪嬭搗鏉ュ儚鏄竴涓畬緹庣殑瑙e喅鏂規錛屼絾鏄湪鏌愪簺鏉′歡涓嬩粛鐒朵笉琛屻傜畝鍗曠殑璇達紝緙栬瘧鍣ㄤ負浜嗘晥鐜囧彲鑳戒細閲嶆帓鎸囦護鐨勬墽琛岄『搴?compiler-based reorderings)銆傜湅榪欎竴琛屼唬鐮侊細

_instance聽=new聽Singleton();

鍦ㄧ紪璇戝櫒鏈紭鍖栫殑鎯呭喌涓嬮『搴忓涓嬶細
1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱
2.鍦ㄥ垎閰嶇殑鍐呭瓨涓婃瀯閫燬ingleton瀵硅薄錛?br />3.鍐呭瓨鍦板潃璧嬪肩粰_instance銆?/span>

浣嗘槸褰撶紪璇戝櫒浼樺寲鍚庢墽琛岄『搴忓彲鑳藉涓嬶細
1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱
2.鍐呭瓨鍦板潃璧嬪肩粰_instance錛?br />3.鍦ㄥ垎閰嶇殑鍐呭瓨涓婃瀯閫燬ingleton瀵硅薄銆?/span>

褰撶紪璇戝櫒浼樺寲鍚庯紝濡傛灉綰跨▼涓鎵ц鍒?鍚庤鎸傝搗銆傜嚎紼嬩簩寮濮嬫墽琛屽茍鍙戠幇0 == _instance涓篺alse錛屼簬鏄洿鎺eturn錛岃岃繖鏃禨ingleton瀵硅薄鍙兘榪樻湭鏋勯犲畬鎴愶紝鍚庢灉...

涓婇潰璇寸殑榪樺彧鏄崟澶勭悊鍣ㄧ殑鎯呭喌錛屽湪澶氬鐞嗗櫒(multiprocessors)鐨勬儏鍐典笅錛岃秴綰跨▼鎶鏈繀鐒朵細娣峰悎鎵ц鎸囦護錛屾寚浠ょ殑鎵ц欏哄簭鏇存棤娉曚繚闅溿傚叧浜?span style="COLOR: #333399">Double-Checked Locking
鐨勬洿璇︾粏鐨勬枃绔狅紝璇風湅錛?br />The "Double-Checked Locking is Broken" Declaration

5.浣跨敤volatile鍏抽敭瀛?br />涓轟簡璇存槑闂錛岃鍏堣冭檻濡備笅浠g爜錛?br />
聽1class聽MyThread聽:聽public聽Thread聽{
聽2public
:
聽3聽聽聽聽virtual聽void
聽run()聽{
聽4聽聽聽聽聽聽聽聽while聽(!
_stopped)聽{
聽5聽聽聽聽聽聽聽聽聽聽聽聽//do聽something

聽6聽聽聽聽聽聽聽聽}
聽7
聽聽聽聽}
聽8聽聽聽聽void
聽stop()聽{
聽9聽聽聽聽聽聽聽聽_stopped聽=true
;
10
聽聽聽聽}
11private
:
12
聽聽聽聽bool聽_stopped;
13
};
14

15聽...
16
17MyThread聽thread;
18thread.start();
涓婇潰鐢╰hread.start()寮鍚簡涓涓嚎紼嬶紝璇ョ嚎紼嬪湪while寰幆涓嫻媌ool鏍囪_stopped錛岀湅鏄惁璇ョ戶緇墽琛屻傚鏋滄兂瑕佺粨鏉熻繖涓嚎紼嬶紝璋冪敤thread.stop()搴旇娌¢棶棰樸備絾鏄渶瑕佹敞鎰忕殑鏄紪璇戝櫒寰堟湁鍙兘瀵筥stopped鐨勫瓨鍙栬繘琛屼紭鍖栥傚鏋滅紪璇戝櫒鍙戠幇_stopped琚綣佸瓨鍙?_stopped鍦╳hile寰幆涓?錛岀紪璇戝櫒鍙兘浼氳冭檻灝哶stopped緙撳瓨鍒板瘎瀛樺櫒涓紝浠ュ悗_stopped灝嗕細鐩存帴浠庡瘎瀛樺櫒瀛樺彇銆傝繖鏃跺欏鏋滄煇涓嚎紼嬭皟鐢ㄤ簡thread.stop()錛屽_stopped鐨勪慨鏀瑰皢涓嶄細鍙嶆槧鍒板瘎瀛樺櫒涓紝thread灝嗕細姘歌繙寰幆涓嬪幓...

涓轟簡闃叉緙栬瘧鍣ㄤ紭鍖栵紝鐢╲olatile鍏抽敭瀛楀氨OK浜嗭紝volatile璺焎onst鐨勭敤娉曞嚑涔庝竴鏍鳳紝鑳界敤const鐨勫湴鏂逛篃閮借兘鐢╲olatile銆傚Singleton鏉ヨ錛屼慨鏀瑰涓嬩袱澶勫嵆鍙細
1//singleton.h涓?/span>
2static聽Singleton聽*_instance;
3//鏀逛負

4static聽Singleton聽*volatile聽_instance;
5

6//singleton.cpp涓?/span>
7Singleton*聽Singleton::_instance聽=0;
8//鏀逛負

9Singleton*volatile聽Singleton::_instance聽=0;


6.灝哠ingleton娉涘寲涓烘ā鏉?br />singleton.h
聽1#ifndef聽SINGLETON_H
聽2
#define聽SINGLETON_H
聽3

聽4#include聽"synobj.h"
聽5
聽6template<class聽T>
聽7class聽Singleton聽{
聽8
聽聽聽聽CLASS_UNCOPYABLE(Singleton)
聽9public
:
10聽聽聽聽static聽T&聽Instance()聽{聽//聽Unique聽point聽of聽access

11聽聽聽聽聽聽聽聽if聽(0==聽_instance)聽{
12
聽聽聽聽聽聽聽聽聽聽聽聽Lock聽lock(_mutex);
13聽聽聽聽聽聽聽聽聽聽聽聽if聽(0==
聽_instance)聽{
14聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽_instance聽=new
聽T();
15
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽atexit(Destroy);
16
聽聽聽聽聽聽聽聽聽聽聽聽}
17
聽聽聽聽聽聽聽聽}
18聽聽聽聽聽聽聽聽return*
_instance;
19
聽聽聽聽}
20protected
:
21
聽聽聽聽Singleton(){}
22聽聽聽聽~
Singleton(){}
23private
:
24聽聽聽聽staticvoid聽Destroy()聽{聽//聽Destroy聽the聽only聽instance

25聽聽聽聽聽聽聽聽if聽(聽_instance聽!=0聽)聽{
26
聽聽聽聽聽聽聽聽聽聽聽聽delete聽_instance;
27聽聽聽聽聽聽聽聽聽聽聽聽_instance聽=0
;
28
聽聽聽聽聽聽聽聽}
29
聽聽聽聽}
30聽聽聽聽static
聽Mutex聽_mutex;
31聽聽聽聽static聽T聽*volatile聽_instance;聽//聽The聽one聽and聽only聽instance

32};
33

34template<class聽T>
35Mutex聽Singleton<T>::_mutex;
36

37template<class聽T>
38T聽*volatile聽Singleton<T>::_instance聽=0;
39

40#endif/*SINGLETON_H*/

嫻嬭瘯浠g爜錛?br />test.cpp
聽1#include聽"singleton.h"
聽2
聽3class聽A聽:聽public聽Singleton<A>聽{
聽4聽聽聽聽friend聽class聽Singleton<A>
;
聽5protected
:
聽6
聽聽聽聽A(){}
聽7聽聽聽聽~
A(){}
聽8public
:
聽9聽聽聽聽void
聽DoSomething(){}
10
};
11

12int聽main()聽{
13

14聽聽聽聽A聽&a聽=聽A::Instance();
15
聽聽聽聽a.DoSomething();
16

17聽聽聽聽return0;
18}


7.Singleton鐨勬瀽鏋勯棶棰?/strong>
鍒版Singleton宸茬粡綆楁瘮杈冨畬鍠勪簡錛屼絾鏄緷鐒剁畻涓嶄笂瀹岀編錛屽洜涓哄埌鐜板湪鍙槸瑙e喅浜嗗綰跨▼闂錛屽姞鍏ヤ簡妯℃澘鏀寔錛屽浜?span style="COLOR: #333399">KDL problem(The Dead Reference Problem)渚濈劧娌℃硶瑙e喅錛屽彲浠ヨ鍦ㄥ疄鐜癝ingleton妯″紡鏃訛紝鏈澶х殑闂灝辨槸澶氫釜鏈変緷璧栧叧緋葷殑Singleton鐨勬瀽鏋勯『搴?/span>銆傝櫧鐒?em style="COLOR: #333399">Modern C++ Design涓粰鍑轟簡瑙e喅鏂規錛屼絾鏄?span style="COLOR: #333399">Loki鐨勫疄鐜板お榪囧鏉傦紝鍦ㄦ灝變笉璇︾粏璇存槑浜嗭紝鏈夊叴瓚g殑鍙互鐪嬬湅Modern C++ Design錛屽綋鐒朵簡錛?span style="COLOR: #333399">Loki搴撲腑鐢ㄧ瓥鐣ユā寮忓疄鐜扮殑Singleton涔熷緢涓嶉敊錛?br />



]]>
闈炲畬緹嶤++ Singleton瀹炵幇[1]http://www.shnenglu.com/ant/archive/2007/09/07/31445.html铓傝殎緇堢粨鑰?/dc:creator>铓傝殎緇堢粨鑰?/author>Fri, 07 Sep 2007 06:49:00 GMThttp://www.shnenglu.com/ant/archive/2007/09/07/31445.htmlhttp://www.shnenglu.com/ant/comments/31445.htmlhttp://www.shnenglu.com/ant/archive/2007/09/07/31445.html#Feedback12http://www.shnenglu.com/ant/comments/commentRss/31445.htmlhttp://www.shnenglu.com/ant/services/trackbacks/31445.htmlSingleton妯″紡鏄竴縐嶉潪甯哥畝鍗曠殑璁捐妯″紡錛岃繖縐嶆ā寮忓緢甯哥敤涔熷緢瀹規槗琚互鐢ㄣ傚綋浣犺璁″簲鐢ㄧ▼搴忕殑鏃跺欙紝緇忓父浼氶亣鍒版煇浜涘璞″湪鏁翠釜紼嬪簭鐨勭敓鍛藉懆鏈熷簲璇ヤ粎鏈変竴涓疄渚嬬殑鎯呭喌錛屾瘮濡?span style="COLOR: #333399">File System錛孏raphic System錛孡ogging Utility錛岃繖鏃跺欏氨鍙互鐢ㄥ埌Singleton妯″紡銆係ingleton妯″紡鍦?span style="COLOR: #333399">GOF涓弿榪板涓嬶細

        Ensure a class only has one instance, and provide a global point of access to it.

Singleton妯″紡鐨勫畾涔夊緢綆鍗曪紝瀹炵幇涔熸湁N澶氱錛屼絾鏄嵈寰堥毦鎵懼埌涓涓О寰椾笂“瀹岀編”鐨勩傚疄鐜頒竴涓畬緹庣殑Singleton姣旀兂璞′腑瑕侀毦鐨勫錛屼笅闈㈡帰绱㈡х殑鏉ュ疄鐜頒竴涓潪瀹岀編鐨勩?br>
1.鍏稿瀷瀹炵幇
鍦–++涓紝Singleton妯″紡鐨勫吀鍨嬪疄鐜板涓嬶細

 1 // Header file Singleton.h
 2 class  Singleton {
 3 public
:
 4     static Singleton& Instance() { // Unique point of access

 5         if (0 ==  _instance)
 6             _instance = new
 Singleton();
 7         return *
_instance;
 8 
    }
 9     void
 DoSomething();
10 private
:
11     Singleton(); // Prevent clients from creating a new Singleton

12     ~Singleton(); // Prevent clients from deleting a Singleton
13     Singleton(const Singleton&); // Prevent clients from copying a Singleton
14     Singleton& operator=(const Singleton& );
15 private
:
16     static Singleton *_instance; // The one and only instance

17  };
18 

19 // Implementation file Singleton.cpp
20 Singleton* Singleton::_instance = 0;


閫氳繃灝哠ingleton鐨勬瀯閫犲嚱鏁拌涓簆rivate鍙互紱佹瀹㈡埛浠g爜鐩存帴鍒涘緩Singleton瀵硅薄錛岄櫎姝や箣澶栵紝Singleton鐨刢opy constructor鍜宑opy assignment operator閮戒負private涓斾粎鏈夊0鏄庢病鏈夊疄鐜幫紝紱佹浜嗗鎴蜂唬鐮佹嫹璐漇ingleton瀵硅薄銆傚敮涓鍙互鍒涘緩Singleton瀵硅薄鐨勬槸Singleton鑷繁鐨勯潤鎬佹垚鍛樺嚱鏁癐nstance錛岃繖鏍峰氨鍦ㄧ紪璇戝櫒淇濊瘉浜哠ingleton瀹炰緥鐨勫敮涓鎬с備笂闈㈣繖浜涙槸鍦–++涓疄鐜癝ingleton妯″紡鏈鍩烘湰鐨勮鐐廣?br>
Instance鏂規硶淇濊瘉鍙湁鍦ㄧ涓嬈¤皟鐢ㄦ椂鎵嶄細鐢熸垚Singleton瀵硅薄錛屼互鍚庣殑璋冪敤鍙槸綆鍗曡繑鍥炲敮涓鐨勫凡瀛樺湪鐨勫疄渚嬨侷nstance鏂規硶瀹為檯涓婂疄鐜扮殑鏄?span style="COLOR: #333399">鎳掓儼鍒濆鍖?lazy initialize)錛?/em>濡傛灉紼嬪簭涓牴鏈病鏈夌敤鍒癝ingleton瀵硅薄錛屼篃灝辨牴鏈笉浼氫駭鐢烻ingleton鐨勫疄渚嬶紝榪欏湪Singleton瀵硅薄寰堝皯浣跨敤涓斿垱寤篠ingleton瀵硅薄寮閿姣旇緝澶х殑鎯呭喌涓嬬壒鍒湁鐢ㄣ?/p>

瀹㈡埛浠g爜鐜板湪鍙互榪欐牱浣跨敤Singleton錛?/p>

1 Singleton &=  Singleton::Instance();
2 s.DoSomething();


榪橀渶瑕佽鏄庣殑鏄疭ingleton鐨勬瀽鏋勫嚱鏁幫紝鏋愭瀯鍑芥暟涔熶負private鍙互紱佹瀹㈡埛鍐欏嚭濡備笅浠g爜銆傚鏋滄煇涓鎴峰啓鍑轟簡濡備笅浠g爜錛岄殢鍚庣殑瀵筍ingleton鐨勮闂氨浼氬鑷翠負瀹氫箟琛屼負錛屽洜涓篠ingleton瀵硅薄宸茬粡涓嶅瓨鍦ㄣ?br>

1 Singleton *= & Singleton::Instance();
2 delete p;


2.寮曞叆smart pointer
涓婇潰鐨勫疄鐜扮畻鏄竴涓ソ鐨勫疄鐜板悧錛熷綋鐒朵笉鏄紝鎴栬榪炰竴涓紜殑瀹炵幇閮界畻涓嶄笂銆傚鏋滀綘鎯沖噾鍚堬紝褰撶劧娌¢棶棰橈紝涓婇潰鐨勪唬鐮佸ぇ澶氭暟鎯呭喌涓嬪彲浠ュ伐浣滅殑寰堝ソ銆備篃璁鎬綘宸茬粡娉ㄦ剰鍒頒簡涓浜涢棶棰橈紝姣斿璇村湪涓婇潰鐨勪唬鐮佷腑鍙湁new娌℃湁delete銆傛槸鐨勶紝浣犺浼氬彂鐢焟emory leak瀵瑰惂錛屽叾瀹瀖emory leak閮戒笉鏄富瑕佺殑闂錛屾墍鏈夌殑鐜頒唬鎿嶄綔緋葷粺鍦ㄨ繘紼嬬粨鏉熺殑鏃跺欓兘浼氬鍐呭瓨寰堝ソ鐨勮繘琛屽洖鏀躲傛瘮memory leak鏇村煎緱璁╀漢鎷呭咖鐨勬槸resource leak錛屽鏋淪ingleton鍦ㄦ瀯閫犲嚱鏁頒腑璇鋒眰浜嗘煇浜涜祫婧愶細緗戠粶榪炴帴錛屾枃浠跺彞鏌勶紝鏁版嵁搴撹繛鎺ョ瓑銆傝繖浜涜祫婧愬皢寰椾笉鍒伴噴鏀俱?br>
鍞竴淇resource leak鐨勬柟娉曞氨鏄湪紼嬪簭緇撴潫鐨勬椂鍊檇elete _instance銆傚綋鐒朵簡錛岀敤smart pointer鍐嶅ソ涓嶈繃錛屽湪榪欓噷鐢╝uto_ptr灝卞彲浠ユ弧瓚抽渶瑕佷簡(濡傛灉浣犺繕涓嶇煡閬搒mart_ptr鏄粈涔堬紝鑺辯偣鏃墮棿鐔熸倝C++鏍囧噯搴撳惂)錛屼慨鏀瑰悗鐨勪唬鐮佸涓嬶細

 1 // Header file Singleton.h
 2 class  Singleton {
 3 public
:
 4     static Singleton& Instance() { // Unique point of access

 5         if (0 ==  _instance.get())
 6             _instance.reset(new
 Singleton());
 7         return *
(_instance.get());
 8 
    }
 9     void
 DoSomething(){}
10 private
:
11     Singleton(){} // Prevent clients from creating a new Singleton

12     ~Singleton(){} // Prevent clients from deleting a Singleton
13     Singleton(const Singleton&); // Prevent clients from copying a Singleton
14     Singleton& operator=(const Singleton& );
15 private
:
16     friend auto_ptr<Singleton>
;
17     static auto_ptr<Singleton> _instance; // The one and only instance

18  };
19 

20 // Implementation file Singleton.cpp
21 auto_ptr<Singleton> Singleton::_instance;


3.鐢╝texit鏇挎崲smart pointer
C++騫舵病鏈夎瀹氫笉鍚?span style="COLOR: #333399">緙栬瘧鍗曞厓(translation unit錛岀畝鍗曡灝辨槸涓涓彲緙栬瘧鐨刢pp鏂囦歡)涓璼tatic瀵硅薄鐨勫垵濮嬪寲欏哄簭銆傚鏋滀竴涓▼搴忎腑鏈夊涓猄ingleton瀵硅薄錛岄偅涔堣繖浜汼ingleton瀵硅薄鐨勬瀽鏋勯『搴忎篃灝嗘槸浠繪剰鐨勩傚緢鏄劇劧錛屽綋澶氫釜Singleton瀵硅薄鏈変緷璧栧叧緋繪椂錛宻mart pointer鏍規湰鏃犳硶淇濊瘉Singleton鐨勬瀽鏋勯『搴忋?br>
msdn涓atexit鎻忚堪濡備笅錛?/p>

The atexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to atexit create a register of functions that are executed in last-in, first-out (LIFO) order. The functions passed to atexit cannot take parameters. atexit  use the heap to hold the register of functions. Thus, the number of functions that can be registered is limited only by heap memory.

闇瑕佽鏄庣殑鏄痑texit騫朵笉姣攕mart pointer濂藉灝戯紝LIFO鐨勪繚璇佸浜庢湁澶嶆潅渚濊禆鍏崇郴鐨勫涓猄ingleton渚濈劧鏉熸墜鏃犲姏錛屼絾鏄敤atexit鏇挎崲smart pointer鍗存槸蹇呴』鐨勶紝瀹冩槸璁捐瀹岀編Singleton鐨勫熀紜銆?br>

#濡傛灉浣犵枒鎯慳texit涓轟粈涔堣繕鏄笉琛岋紝璇瘋冭檻涓嬮潰鐨勬儏鍐碉細
NOTE錛氫笅闈㈢殑鎯呭喌鍦?em>Modern C++ Design
涓彨鍋?em style="COLOR: #333399">KDL(Keyboard,Display,Log)problem銆?br>
鏌愪釜紼嬪簭涓嬌鐢ㄤ簡濡備笅3涓猄ingleton錛?span style="COLOR: #333399">Keyboard錛?span style="COLOR: #333399">Display錛?span style="COLOR: #333399">Log銆?span style="COLOR: #333399">Keyboard鍜?span style="COLOR: #333399">Display鍒嗗埆瀵瑰簲浜庤綆楁満鐨勯敭鐩樺拰鏄劇ず鍣紝Log鐢ㄦ潵璁板綍閿欒淇℃伅銆傚亣璁懼綋Keyboard鍜?span style="COLOR: #333399">Display鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鍑虹幇閿欒鏃朵細璋冪敤Log璁板綍閿欒淇℃伅錛屽茍涓旀瀯閫犲拰鏋愭瀯瀵艱嚧鐨勪換浣曢敊璇兘浼氱粓姝㈢▼搴忋?br>
鍦ㄧ▼搴忓惎鍔ㄦ椂錛屽鏋?span style="COLOR: #333399">Keyboard鏋勯犳垚鍔燂紝Display鏋勯犲け璐ワ紝寰堟樉鐒跺湪Display鐨勬瀯閫犲嚱鏁頒腑灝嗕細鏋勯?span style="COLOR: #333399">Log鑰屼笖澶辮觸淇℃伅浼氳Log璁板綍錛屾牴鎹亣璁捐繖鏃跺欑▼搴忓噯澶囬鍑猴紝atexit娉ㄥ唽鐨勫嚱鏁板皢浼氭寜LIFO鐨勯『搴忚璋冪敤銆傚洜涓?span style="COLOR: #333399">Keyboard鍏堜簬Log鏋勯狅紝鎵浠?span style="COLOR: #333399">Log鍏堜簬Keyboard鏋愭瀯錛屼絾鏄綋鐢變簬鏌愮鍘熷洜Keyboard鍦ㄦ瀽鏋勬椂澶辮觸錛屾兂瑕佽皟鐢?span style="COLOR: #333399">Log璁板綍閿欒淇℃伅鏃訛紝Log鏃╁凡琚攢姣侊紝鍒橪og::Instance()灝嗕細瀵艱嚧鏈畾涔夎涓恒?br>

#atexit鐨勪弗閲嶉棶棰橈細
浠庝笂闈㈢殑渚嬪瓙鍙互鐪嬪嚭錛宎texit鍜宻mart pointer鐩告瘮浠呬粎鏄湁LIFO鐨勪繚璇佽屽凡錛岃繖鏍風殑淇濊瘉璨屼技涔熶笉鎬庝箞鏈夋晥錛屽洜涓篴texit璺焥mart pointer涓鏍蜂篃鏃犳硶瑙e喅KDL probleam銆?br>
atexit鐢變簬LIFO甯︽潵浜嗗彟澶栫殑闂錛岀湅涓嬮潰鐨勪唬鐮侊細

 1 #include <cstdlib>
 2 void  Bar() {
 3 
    ...
 4 
}
 5 void
 Foo() {
 6 
    std::atexit(Bar);
 7 
}
 8 int
 main() {
 9 
    std::atexit(Foo);
10     return 0
;
11 }

涓婇潰鐨勫皬孌典唬鐮佺敤atexit娉ㄥ唽浜咶oo錛孎oo璋冪敤浜唖td::atexit(Bar)銆傚綋紼嬪簭閫鍑烘椂錛屾牴鎹產texit鐨凩IFO淇濊瘉錛孊ar鍦‵oo涔嬪悗娉ㄥ唽錛屽洜姝ar搴旇鍦‵oo涔嬪墠璋冪敤錛屼絾鏄綋Bar娉ㄥ唽鐨勬椂鍊橣oo宸茬粡璋冪敤浜嗭紝Bar鏍規湰灝辨病鏈夋満浼氳兘澶熷湪Foo涔嬪墠璋冪敤銆傝繖鏄庢樉鑷浉鐭涚浘瀵瑰惂錛屾病鍔炴硶錛孋++鏍囧噯濂藉儚蹇借浜嗚繖涓鐐癸紝鍥犳濡傛灉綾諱技浠g爜琚皟鐢紝鑲畾涓嶄細鏈変粈涔堝ソ鐨勭粨鏋滐紝濂戒竴鐐規槸resource leak錛屽樊涓鐐逛及璁$▼搴忓氨宕╂簝浜嗭紒錛侊紒

atexit鐨勮繖涓棶棰樿窡Singleton鏈夊叧緋誨悧錛熷綋鐒舵湁錛屽鏋滃湪涓涓猄ingleton鐨勬瀽鏋勫嚱鏁頒腑璋冪敤atexit灝變細鍑虹幇涓婅堪闂銆傚嵆鍦?span style="COLOR: #333399">KDL problem涓紝濡傛灉Keyboard鍜?span style="COLOR: #333399">Display閮芥瀯閫犳垚鍔燂紝褰?span style="COLOR: #333399">Keyboard鎴?span style="COLOR: #333399">Display浠繪剰涓涓瀽鏋勫け璐ユ椂錛?span style="COLOR: #333399">Keyboard鎴?span style="COLOR: #333399">Display鍦ㄦ瀽鏋勫嚱鏁頒腑浼氭瀯閫?span style="COLOR: #333399">Log錛?span style="COLOR: #333399">Log鐨勬瀯閫犲嚱鏁頒細闂存帴璋冪敤atexit銆俹ops!!!錛屽彲鎬曠殑鏈畾涔夎涓恒?br>
鐪嬪埌榪欓噷浣犱竴瀹氬atexit鐩稿綋澶辨湜錛岃矊浼煎畠甯︽潵鐨勫ソ澶勫浜庡潖澶勩備絾鏄浣犵浉淇★紝濡傛灉閫傚綋璁捐錛宎texit鍦ㄥ悗闈㈢殑Singleton鏀歸犱腑浼氳搗鍒板緢閲嶈鐨勪綔鐢ㄣ?br>
鐢╝texit鍚庣殑浠g爜錛?/p>

 1 // Header file Singleton.h
 2 class  Singleton {
 3 public
:
 4     static Singleton& Instance() { // Unique point of access

 5         if (0 ==  _instance) {
 6             _instance = new
 Singleton();
 7             atexit(Destroy); // Register Destroy function

 8          }
 9         return *
_instance;
10 
    }
11     void
 DoSomething(){}
12 private
:
13     static void Destroy() { // Destroy the only instance

14         if ( _instance != 0  ) {
15 
            delete _instance;
16             _instance = 0
;
17 
        }
18 
    }
19     Singleton(){} // Prevent clients from creating a new Singleton

20     ~Singleton(){} // Prevent clients from deleting a Singleton
21     Singleton(const Singleton&); // Prevent clients from copying a Singleton
22     Singleton& operator=(const Singleton& );
23 private
:
24     static Singleton *_instance; // The one and only instance

25  };
26 

27 // Implementation file Singleton.cpp
28 Singleton* Singleton::_instance = 0;

浣犳湁娌℃湁浠旂粏鑰冭檻榪嘍estroy涓殑_instance = 0;榪欎竴琛屼唬鐮侊紝涓婅堪浠g爜瀹為檯涓婂疄鐜扮殑鏄?em style="COLOR: #333399">涓嶆楦熸ā寮?The Phoenix Singleton)錛?/em>鎵璋撲笉姝婚笩錛屽氨璺熶竴杈変竴鏍峰彲浠ユ鑰屽鐢熴備笂闈㈢殑浠g爜鍙互瑙e喅鏈枃鏈鏃╂彁鍑虹殑KDL problem錛屽嵆濡傛灉Keyboard鏋愭瀯澶辮觸錛岃櫧鐒?span style="COLOR: #333399">Log宸茬粡鏋愭瀯錛屼絾鏄敱浜嶥estroy涓殑_instance = 0;榪欎竴琛屼唬鐮侊紝Log::Instance()灝嗕細鍒涘緩涓涓柊鐨?span style="COLOR: #333399">Log瀵硅薄錛岀▼搴忓皢浼氳〃鐜拌壇濂姐傚綋鐒朵簡錛?span style="COLOR: #993366">Phoenix Singleton浠呰兘鐢ㄤ簬鏃犵姸鎬佺殑Singleton錛屽鏋?span style="COLOR: #333399">Log闇瑕佷繚瀛樻煇浜涚姸鎬侊紝Phoenix Singleton涔熶笉浼氬甫鏉ヤ換浣曞ソ澶勩備綘褰撶劧鍙互鐢ㄦ煇浜涙柟娉曠淮鎸?span style="COLOR: #993366">Phoenix Singleton鐨勭姸鎬侊紝浣嗘槸鍦ㄥ仛涔嬪墠鍏堟兂鎯崇湅鏄惁鍊煎緱錛岀淮鎸佺姸鎬佸彲鑳戒細浣縎ingleton鍙樺緱鐗瑰埆澶嶆潅銆?br>
涓婇潰鐨?span style="COLOR: #993366">Phoenix Singleton宸茬粡鍙互婊¤凍澶ч儴鍒嗛渶瑕侊紝濡傛灉浣犵殑Singleton娌℃湁娑夊強鍒板綰跨▼錛屽涓猄ingleton涔嬮棿涔熸病鏈変緷璧栧叧緋伙紝浣犲ぇ鍙互鏀懼績浣跨敤銆備絾鏄鏋滀綘鐢ㄥ埌澶氱嚎紼嬶紝鎴栬呬綘鐨凷ingleton鍏崇郴濡?span style="COLOR: #333399">KDL鑸鏉傦紝鎴栬呬綘瑙夊緱瀵規瘡涓涓猄ingleton閮芥暡鍚屾牱鐨勪唬鐮佽浣犲帉鐑︺傚湪鍚庨潰鍑犵瘒浼氭湁涓涓?span style="COLOR: #993366">澶氱嚎紼嬪畨鍏?/span>鐨勶紝鑳藉瑙e喅澶氫釜Singleton渚濊禆鍏崇郴鐨勶紝鍩轟簬妯℃澘鐨凷ingleton瀹炵幇銆?br>

]]>
日本一区精品久久久久影院| 久久久久久无码国产精品中文字幕 | 中文字幕一区二区三区久久网站| 91精品无码久久久久久五月天| 久久免费大片| 伊人久久成人成综合网222| 久久伊人精品一区二区三区| 狠狠综合久久AV一区二区三区| A级毛片无码久久精品免费| 99久久国产综合精品网成人影院| 狠狠综合久久综合88亚洲| 国内精品人妻无码久久久影院导航| 久久本道综合久久伊人| 欧美无乱码久久久免费午夜一区二区三区中文字幕| 久久精品国产福利国产琪琪| 久久综合成人网| 亚洲精品无码久久久久去q| 国产精品一区二区久久国产| 9191精品国产免费久久| 亚洲国产成人久久精品99| 久久亚洲精精品中文字幕| 国产成人精品综合久久久| 久久频这里精品99香蕉久| aaa级精品久久久国产片| 久久久久女教师免费一区| 亚洲精品乱码久久久久久蜜桃不卡| 伊人久久大香线蕉精品不卡 | 久久无码人妻精品一区二区三区| 91精品国产综合久久久久久| 久久精品国产亚洲精品| 亚洲综合伊人久久综合| 久久亚洲国产精品一区二区| 怡红院日本一道日本久久 | 久久婷婷成人综合色综合| 久久97久久97精品免视看| 无遮挡粉嫩小泬久久久久久久| 久久精品人妻中文系列| 四虎国产精品免费久久久| 久久午夜无码鲁丝片秋霞 | 久久久久女教师免费一区| 中文无码久久精品|