無論是太陽下,還是風(fēng)雨中,都要成長!
在前面的例子中,我們看到:采用 new 來為單件對(duì)象分配空間,如果采用手動(dòng)調(diào)用 delete 或封裝了 delete 的 Release 操作,一旦遇到全局對(duì)象的析構(gòu)有調(diào)用單件對(duì)象,就會(huì)使得無法在代碼中找到適合釋放單件對(duì)象的時(shí)機(jī)。那么,是否可以讓系統(tǒng)來自動(dòng)選擇時(shí)機(jī),調(diào)用釋放呢?如果可以,又該怎么在代碼中構(gòu)建單件對(duì)象的自動(dòng)釋放機(jī)制呢? 對(duì)這兩個(gè)問題,在進(jìn)行了一番思考和嘗試后,終于找到了答案 —— 內(nèi)建只有一個(gè)析構(gòu)方法的結(jié)構(gòu)體,定義一個(gè)靜態(tài)的該結(jié)構(gòu)體的變量,并在結(jié)構(gòu)體的析構(gòu)中釋放單件對(duì)象。下文將就此給出 Demo,還望有高手能給出更好的方案。(從前面內(nèi)容,我們已經(jīng)知道,單件對(duì)象的指針通過靜態(tài)類成員變量進(jìn)行存儲(chǔ),并通過 new 分配的方式,存在在著線程安全的問題。同理,下面Demo的單件類A在多線程環(huán)境使用時(shí),自然也存在線程安全的問題。)
Demo代碼如下:
運(yùn)行后的結(jié)果:
綜合Demo代碼和運(yùn)行結(jié)果,我們可以看到,對(duì)于單件類A的對(duì)象釋放者采用了類的靜態(tài)成員的方式來定義,其結(jié)果是,單件類A的對(duì)象釋放時(shí)機(jī)仍然不對(duì)。
再看C,代碼中new 所得的對(duì)象指針交由一局部靜態(tài)變量以保證 new 只會(huì)執(zhí)行一次(從而保證了線程安全), 而單件對(duì)象的釋放者就定義在緊挨 new 的前面(事實(shí)上,也可以定義在緊挨 new 的后面)。接著是執(zhí)行結(jié)果,完全OK! 哈哈~,值得推薦的第二種C++單件類構(gòu)建模式終于也出爐了,那就是上例Demo中,單件類C的構(gòu)建模式。
至此,《Singleton模式——C++應(yīng)用》全部完成,因?yàn)檫€是第一次寫技術(shù)博客,寫得不好,還請各位看官見諒!
嗯~,突然發(fā)現(xiàn),我漏寫了對(duì)這全部四篇內(nèi)容的一個(gè)總結(jié),……還是算了,就請各位原諒我這次的偷懶咯!~
posted on 2012-03-14 01:07 青碧竹 閱讀(342) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式
Powered by: C++博客 Copyright © 青碧竹