锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
2聽聽聽聽聽if聽(0聽==聽_instance)聽{聽//1
3聽聽聽聽聽聽聽聽聽_instance聽=聽new聽Singleton();聽//2
4聽聽聽聽聽聽聽聽聽atexit(Destroy);
5聽聽聽聽聽}
6聽聽聽聽聽return聽*_instance;聽//3
7聽}
瑙e喅鏂規(guī)硶寰堢畝鍗曪紝寮曞叆鐩稿叧鍚屾瀵硅薄(synchronization object)灝辮浜嗭紝渚嬪鍦╳in32騫沖彴涓嬪彲浠ュ涓嬪疄鐜幫細(xì)
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聽
11聽class聽Mutex聽{
12聽聽聽聽聽CLASS_UNCOPYABLE(Mutex)
13聽public:
14聽聽聽聽聽Mutex()聽:_cs()聽{聽InitializeCriticalSection(&_cs);聽}
15聽聽聽聽聽~Mutex()聽{聽DeleteCriticalSection(&_cs);聽}
16聽聽聽聽聽void聽lock()聽{聽EnterCriticalSection(&_cs);聽}
17聽聽聽聽聽void聽unlock()聽{聽LeaveCriticalSection(&_cs);聽}
18聽private:
19聽聽聽聽聽CRITICAL_SECTION聽_cs;
20聽};
21聽
22聽class聽Lock聽{
23聽聽聽聽聽CLASS_UNCOPYABLE(Lock)
24聽public:
25聽聽聽聽聽explicit聽Lock(Mutex&聽cs)聽:_cs(cs)聽{聽_cs.lock();聽}
26聽聽聽聽聽~Lock()聽{聽_cs.unlock();聽}
27聽private:
28聽聽聽聽聽Mutex&聽_cs;
29聽};
30聽
31聽#endif/*SYNOBJ_H*/
鏈変簡鍚屾瀵硅薄寰堝鏄撳氨鑳藉鍐欏嚭濡備笅浠g爜錛?br />singleton.h
聽2聽#define聽SINGLETON_H
聽3聽
聽4聽#include聽"synobj.h"
聽5聽
聽6聽class聽Singleton聽{
聽7聽public:
聽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(){}
17聽private:
18聽聽聽聽聽static聽void聽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&);
28聽private:
29聽聽聽聽聽static聽Mutex聽_mutex;
30聽聽聽聽聽static聽Singleton聽*_instance;聽//聽The聽one聽and聽only聽instance
31聽};
32聽
33聽#endif/*SINGLETON_H*/
singleton.cpp
2聽
3聽Mutex聽Singleton::_mutex;
4聽Singleton*聽Singleton::_instance聽=聽0;
2聽聽聽聽聽if聽(0聽==聽_instance)聽{
3聽聽聽聽聽聽聽聽聽Lock聽lock(_mutex);
4聽聽聽聽聽聽聽聽聽_instance聽=聽new聽Singleton();
5聽聽聽聽聽聽聽聽聽atexit(Destroy);
6聽聽聽聽聽}
7聽聽聽聽聽return聽*_instance;
8聽}
聽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聽}
_instance聽=聽new聽Singleton();
鍦ㄧ紪璇戝櫒鏈紭鍖栫殑鎯呭喌涓嬮『搴忓涓嬶細(xì)
1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱
2.鍦ㄥ垎閰嶇殑鍐呭瓨涓婃瀯閫燬ingleton瀵硅薄錛?br />3.鍐呭瓨鍦板潃璧嬪肩粰_instance銆?/span>
浣嗘槸褰撶紪璇戝櫒浼樺寲鍚庢墽琛岄『搴忓彲鑳藉涓嬶細(xì)
1.new operator鍒嗛厤閫傚綋鐨勫唴瀛橈紱
2.鍐呭瓨鍦板潃璧嬪肩粰_instance錛?br />3.鍦ㄥ垎閰嶇殑鍐呭瓨涓婃瀯閫燬ingleton瀵硅薄銆?/span>
褰撶紪璇戝櫒浼樺寲鍚庯紝濡傛灉綰跨▼涓鎵ц鍒?鍚庤鎸傝搗銆傜嚎紼嬩簩寮濮嬫墽琛屽茍鍙戠幇0 == _instance涓篺alse錛屼簬鏄洿鎺eturn錛岃岃繖鏃禨ingleton瀵硅薄鍙兘榪樻湭鏋勯犲畬鎴愶紝鍚庢灉...
涓婇潰璇寸殑榪樺彧鏄崟澶勭悊鍣ㄧ殑鎯呭喌錛屽湪澶氬鐞嗗櫒(multiprocessors)鐨勬儏鍐典笅錛岃秴綰跨▼鎶鏈繀鐒朵細(xì)娣峰悎鎵ц鎸囦護(hù)錛屾寚浠ょ殑鎵ц欏哄簭鏇存棤娉曚繚闅溿傚叧浜?span style="COLOR: #333399">Double-Checked Locking鐨勬洿璇︾粏鐨勬枃绔狅紝璇風(fēng)湅錛?br />The "Double-Checked Locking is Broken" Declaration
5.浣跨敤volatile鍏抽敭瀛?br />涓轟簡璇存槑闂錛岃鍏堣冭檻濡備笅浠g爜錛?br />
聽2聽public:
聽3聽聽聽聽聽virtual聽void聽run()聽{
聽4聽聽聽聽聽聽聽聽聽while聽(!_stopped)聽{
聽5聽聽聽聽聽聽聽聽聽聽聽聽聽//do聽something
聽6聽聽聽聽聽聽聽聽聽}
聽7聽聽聽聽聽}
聽8聽聽聽聽聽void聽stop()聽{
聽9聽聽聽聽聽聽聽聽聽_stopped聽=聽true;
10聽聽聽聽聽}
11聽private:
12聽聽聽聽聽bool聽_stopped;
13聽};
14聽
15聽...
16聽
17聽MyThread聽thread;
18聽thread.start();
涓轟簡闃叉緙栬瘧鍣ㄤ紭鍖栵紝鐢╲olatile鍏抽敭瀛楀氨O(jiān)K浜嗭紝volatile璺焎onst鐨勭敤娉曞嚑涔庝竴鏍鳳紝鑳界敤const鐨勫湴鏂逛篃閮借兘鐢╲olatile銆傚Singleton鏉ヨ錛屼慨鏀瑰涓嬩袱澶勫嵆鍙細(xì)
2聽static聽Singleton聽*_instance;
3聽//鏀逛負(fù)
4聽static聽Singleton聽*聽volatile聽_instance;
5聽
6聽//singleton.cpp涓?/span>
7聽Singleton*聽Singleton::_instance聽=聽0;
8聽//鏀逛負(fù)
9聽Singleton*聽volatile聽Singleton::_instance聽=聽0;
6.灝哠ingleton娉涘寲涓烘ā鏉?br />singleton.h
聽2聽#define聽SINGLETON_H
聽3聽
聽4聽#include聽"synobj.h"
聽5聽
聽6聽template<class聽T>
聽7聽class聽Singleton聽{
聽8聽聽聽聽聽CLASS_UNCOPYABLE(Singleton)
聽9聽public:
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聽聽聽聽聽}
20聽protected:
21聽聽聽聽聽Singleton(){}
22聽聽聽聽聽~Singleton(){}
23聽private:
24聽聽聽聽聽static聽void聽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聽
34聽template<class聽T>
35聽Mutex聽Singleton<T>::_mutex;
36聽
37聽template<class聽T>
38聽T聽*聽volatile聽Singleton<T>::_instance聽=聽0;
39聽
40聽#endif/*SINGLETON_H*/
嫻嬭瘯浠g爜錛?br />test.cpp
聽2聽
聽3聽class聽A聽:聽public聽Singleton<A>聽{
聽4聽聽聽聽聽friend聽class聽Singleton<A>;
聽5聽protected:
聽6聽聽聽聽聽A(){}
聽7聽聽聽聽聽~A(){}
聽8聽public:
聽9聽聽聽聽聽void聽DoSomething(){}
10聽};
11聽
12聽int聽main()聽{
13聽
14聽聽聽聽聽A聽&a聽=聽A::Instance();
15聽聽聽聽聽a.DoSomething();
16聽
17聽聽聽聽聽return聽0;
18聽}
7.Singleton鐨勬瀽鏋勯棶棰?/strong>
鍒版Singleton宸茬粡綆楁瘮杈冨畬鍠勪簡錛屼絾鏄緷鐒剁畻涓嶄笂瀹岀編錛屽洜涓哄埌鐜板湪鍙槸瑙e喅浜嗗綰跨▼闂錛屽姞鍏ヤ簡妯℃澘鏀寔錛屽浜?span style="COLOR: #333399">KDL problem(The Dead Reference Problem)
瀹㈡埛浠g爜鐜板湪鍙互榪欐牱浣跨敤Singleton錛?/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.
閫氳繃灝哠ingleton鐨勬瀯閫犲嚱鏁拌涓簆rivate鍙互紱佹瀹㈡埛浠g爜鐩存帴鍒涘緩Singleton瀵硅薄錛岄櫎姝や箣澶栵紝Singleton鐨刢opy constructor鍜宑opy assignment operator閮戒負(fù)private涓斾粎鏈夊0鏄庢病鏈夊疄鐜幫紝紱佹浜嗗鎴蜂唬鐮佹嫹璐漇ingleton瀵硅薄銆傚敮涓鍙互鍒涘緩Singleton瀵硅薄鐨勬槸Singleton鑷繁鐨勯潤鎬佹垚鍛樺嚱鏁癐nstance錛岃繖鏍峰氨鍦ㄧ紪璇戝櫒淇濊瘉浜哠ingleton瀹炰緥鐨勫敮涓鎬с備笂闈㈣繖浜涙槸鍦–++涓疄鐜癝ingleton妯″紡鏈鍩烘湰鐨勮鐐廣?br>
Instance鏂規(guī)硶淇濊瘉鍙湁鍦ㄧ涓嬈¤皟鐢ㄦ椂鎵嶄細(xì)鐢熸垚Singleton瀵硅薄錛屼互鍚庣殑璋冪敤鍙槸綆鍗曡繑鍥炲敮涓鐨勫凡瀛樺湪鐨勫疄渚嬨侷nstance鏂規(guī)硶瀹為檯涓婂疄鐜扮殑鏄?span style="COLOR: #333399">鎳掓儼鍒濆鍖?lazy initialize)錛?/em>濡傛灉紼嬪簭涓牴鏈病鏈夌敤鍒癝ingleton瀵硅薄錛屼篃灝辨牴鏈笉浼?xì)漶旂敓Singleton鐨勫疄渚嬶紝榪欏湪Singleton瀵硅薄寰堝皯浣跨敤涓斿垱寤篠ingleton瀵硅薄寮閿姣旇緝澶х殑鎯呭喌涓嬬壒鍒湁鐢ㄣ?/p>
2 s.DoSomething();
榪橀渶瑕佽鏄庣殑鏄疭ingleton鐨勬瀽鏋勫嚱鏁幫紝鏋愭瀯鍑芥暟涔熶負(fù)private鍙互紱佹瀹㈡埛鍐欏嚭濡備笅浠g爜銆傚鏋滄煇涓鎴峰啓鍑轟簡濡備笅浠g爜錛岄殢鍚庣殑瀵筍ingleton鐨勮闂氨浼?xì)瀵艰嚧湄?fù)瀹氫箟琛屼負(fù)錛屽洜涓篠ingleton瀵硅薄宸茬粡涓嶅瓨鍦ㄣ?br>
2 delete p;
2.寮曞叆smart pointer
涓婇潰鐨勫疄鐜扮畻鏄竴涓ソ鐨勫疄鐜板悧錛熷綋鐒朵笉鏄紝鎴栬榪炰竴涓紜殑瀹炵幇閮界畻涓嶄笂銆傚鏋滀綘鎯沖噾鍚堬紝褰撶劧娌¢棶棰橈紝涓婇潰鐨勪唬鐮佸ぇ澶氭暟鎯呭喌涓嬪彲浠ュ伐浣滅殑寰堝ソ銆備篃璁鎬綘宸茬粡娉ㄦ剰鍒頒簡涓浜涢棶棰橈紝姣斿璇村湪涓婇潰鐨勪唬鐮佷腑鍙湁new娌℃湁delete銆傛槸鐨勶紝浣犺浼?xì)鍙戠敓memory leak瀵瑰惂錛屽叾瀹瀖emory leak閮戒笉鏄富瑕佺殑闂錛屾墍鏈夌殑鐜頒唬鎿嶄綔緋葷粺鍦ㄨ繘紼嬬粨鏉熺殑鏃跺欓兘浼?xì)瀵瑰唴瀛樺緢濂界殑杩涜鍥炴敹銆傛瘮memory leak鏇村煎緱璁╀漢鎷呭咖鐨勬槸resource leak錛屽鏋淪ingleton鍦ㄦ瀯閫犲嚱鏁頒腑璇鋒眰浜嗘煇浜涜祫婧愶細(xì)緗戠粶榪炴帴錛屾枃浠跺彞鏌勶紝鏁版嵁搴撹繛鎺ョ瓑銆傝繖浜涜祫婧愬皢寰椾笉鍒伴噴鏀俱?br>
鍞竴淇resource leak鐨勬柟娉曞氨鏄湪紼嬪簭緇撴潫鐨勬椂鍊檇elete _instance銆傚綋鐒朵簡錛岀敤smart pointer鍐嶅ソ涓嶈繃錛屽湪榪欓噷鐢╝uto_ptr灝卞彲浠ユ弧瓚抽渶瑕佷簡(濡傛灉浣犺繕涓嶇煡閬搒mart_ptr鏄粈涔堬紝鑺辯偣鏃墮棿鐔熸?zhèn)塁++鏍囧噯搴撳惂)錛屼慨鏀瑰悗鐨勪唬鐮佸涓嬶細(xì)
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鏍規(guī)湰鏃犳硶淇濊瘉Singleton鐨勬瀽鏋勯『搴忋?br>
msdn涓atexit鎻忚堪濡備笅錛?/p>
闇瑕佽鏄庣殑鏄痑texit騫朵笉姣攕mart pointer濂藉灝戯紝LIFO鐨勪繚璇佸浜庢湁澶嶆潅渚濊禆鍏崇郴鐨勫涓猄ingleton渚濈劧鏉熸墜鏃犲姏錛屼絾鏄敤atexit鏇挎崲smart pointer鍗存槸蹇呴』鐨勶紝瀹冩槸璁捐瀹岀編Singleton鐨勫熀紜銆?br>
#濡傛灉浣犵枒鎯慳texit涓轟粈涔堣繕鏄笉琛岋紝璇瘋冭檻涓嬮潰鐨勬儏鍐碉細(xì)
NOTE錛氫笅闈㈢殑鎯呭喌鍦?em>Modern C++ Design
鏌愪釜紼嬪簭涓嬌鐢ㄤ簡濡備笅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鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鍑虹幇閿欒鏃朵細(xì)璋冪敤Log璁板綍閿欒淇℃伅錛屽茍涓旀瀯閫犲拰鏋愭瀯瀵艱嚧鐨勪換浣曢敊璇兘浼?xì)缁堟绋嬪簭銆?br>
鍦ㄧ▼搴忓惎鍔ㄦ椂錛屽鏋?span style="COLOR: #333399">Keyboard鏋勯犳垚鍔燂紝Display鏋勯犲け璐ワ紝寰堟樉鐒跺湪Display鐨勬瀯閫犲嚱鏁頒腑灝嗕細(xì)鏋勯?span style="COLOR: #333399">Log鑰屼笖澶辮觸淇℃伅浼?xì)琚?span style="COLOR: #333399">Log璁板綍錛屾牴鎹亣璁捐繖鏃跺欑▼搴忓噯澶囬鍑猴紝atexit娉ㄥ唽鐨勫嚱鏁板皢浼?xì)鎸塋IFO鐨勯『搴忚璋冪敤銆傚洜涓?span style="COLOR: #333399">Keyboard鍏堜簬Log鏋勯狅紝鎵浠?span style="COLOR: #333399">Log鍏堜簬Keyboard鏋愭瀯錛屼絾鏄綋鐢變簬鏌愮鍘熷洜Keyboard鍦ㄦ瀽鏋勬椂澶辮觸錛屾兂瑕佽皟鐢?span style="COLOR: #333399">Log璁板綍閿欒淇℃伅鏃訛紝Log鏃╁凡琚攢姣侊紝鍒橪og::Instance()灝嗕細(xì)瀵艱嚧鏈畾涔夎涓恒?br>
#atexit鐨勪弗閲嶉棶棰橈細(xì)
浠庝笂闈㈢殑渚嬪瓙鍙互鐪嬪嚭錛宎texit鍜宻mart pointer鐩告瘮浠呬粎鏄湁LIFO鐨勪繚璇佽屽凡錛岃繖鏍風(fēng)殑淇濊瘉璨屼技涔熶笉鎬庝箞鏈夋晥錛屽洜涓篴texit璺焥mart pointer涓鏍蜂篃鏃犳硶瑙e喅KDL probleam銆?br>
atexit鐢變簬LIFO甯︽潵浜嗗彟澶栫殑闂錛岀湅涓嬮潰鐨勪唬鐮侊細(xì)
涓婇潰鐨勫皬孌典唬鐮佺敤atexit娉ㄥ唽浜咶oo錛孎oo璋冪敤浜唖td::atexit(Bar)銆傚綋紼嬪簭閫鍑烘椂錛屾牴鎹產(chǎn)texit鐨凩IFO淇濊瘉錛孊ar鍦‵oo涔嬪悗娉ㄥ唽錛屽洜姝ar搴旇鍦‵oo涔嬪墠璋冪敤錛屼絾鏄綋Bar娉ㄥ唽鐨勬椂鍊橣oo宸茬粡璋冪敤浜嗭紝Bar鏍規(guī)湰灝辨病鏈夋満浼?xì)鑳藉鍦‵oo涔嬪墠璋冪敤銆傝繖鏄庢樉鑷浉鐭涚浘瀵瑰惂錛屾病鍔炴硶錛孋++鏍囧噯濂藉儚蹇借浜嗚繖涓鐐癸紝鍥犳濡傛灉綾諱技浠g爜琚皟鐢紝鑲畾涓嶄細(xì)鏈変粈涔堝ソ鐨勭粨鏋滐紝濂戒竴鐐規(guī)槸resource leak錛屽樊涓鐐逛及璁$▼搴忓氨宕╂簝浜嗭紒錛侊紒
atexit鐨勮繖涓棶棰樿窡Singleton鏈夊叧緋誨悧錛熷綋鐒舵湁錛屽鏋滃湪涓涓猄ingleton鐨勬瀽鏋勫嚱鏁頒腑璋冪敤atexit灝變細(xì)鍑虹幇涓婅堪闂銆傚嵆鍦?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鍦ㄦ瀽鏋勫嚱鏁頒腑浼?xì)鏋勯?span style="COLOR: #333399">Log錛?span style="COLOR: #333399">Log鐨勬瀯閫犲嚱鏁頒細(xì)闂存帴璋冪敤atexit銆俹ops!!!錛屽彲鎬曠殑鏈畾涔夎涓恒?br>
鐪嬪埌榪欓噷浣犱竴瀹氬atexit鐩稿綋澶辨湜錛岃矊浼煎畠甯︽潵鐨勫ソ澶勫浜庡潖澶勩備絾鏄浣犵浉淇★紝濡傛灉閫傚綋璁捐錛宎texit鍦ㄥ悗闈㈢殑Singleton鏀歸犱腑浼?xì)钃v鍒板緢閲嶈鐨勪綔鐢ㄣ?br>
鐢╝texit鍚庣殑浠g爜錛?/p>