在《設計模式》中有乙個叫做單件(sigleton)的模式,是用來控制建立唯一物件。書中只講到了如何建立singleton物件
,對於如何來銷毀此物件則隻字不提。但是物件生命的管理對於c
++程式設計師來說是多麼的重要呀。或許singleton只
是屬於建立模式的一種,大師們認為在這裡不應涉及到「銷毀模式」。
有人認為sinleton是應該在程式的退出的時候銷毀的。但是退出應該是在什麼時候呢。
請看如下**:
假設是按設計模式裡的方式來寫乙個物件singlton物件。
class
singlton
public:~
singlton()
static
singlton
*getsinglton()
void
dosomething()
};singlton
*singlton::_insatnce
=null;
void
foo(
inti)
intmain()
事實上如果在singlton某次執行根本就沒有呼叫過foo(
1)而只是呼叫了foo(
0),但是還必
須得在最後程式退出時呼叫實際上這時候呼叫getsinglton()來建立物件馬上就被刪除了
。這是完全沒有必要也是浪費的。想在程式執行時使用判斷語句也是行不通的。這樣的實
現還是可以改進的,使用在singlton中再增加乙個靜態的成員函式checkexistinstance來判
斷物件是否存在,可以提高效率。但這樣又給物件增加了介面,增加了**維護的開銷。
但是物件在程式結束時你並不清楚是不是真的不再需要此物件了。我們再修改**如下。
class
singlton
public:~
singlton()
static
singlton
*getsinglton()
void
dosomething()
};singlton
*singlton::_insatnce
=null;
void
foo(
inti)
class
testsingleton
~testsingleton()
};testsingleton _test;
intmain()且看~
testsingleton()申請出來的物件應該由誰來釋放呢。由此引發了有人主張使用
引用記數器由模仿com的release來實現.實現**如下
class
singleton
static
singleton
*getsinglton()
_instance
=new
singleton;
++m_ref;
return
_instance;
}ulong release()
return
m_ref;
}private
:singleton()
~singleton()
};singleton
*singleton::_instance
=null;
intsingleton::m_ref =0
;void
foo()
int_tmain(
intargc, tchar
*argv, tchar
*envp)
這樣的方式是不存在記憶體洩露的,並且這段**表面上是個單件;實際上,
singleton物件是被多次建立和銷毀的,如果這個物件不像以上**寫得那麼簡單,
是如果在單件中申請了不小的記憶體,那麼以上的**是多麼的不可想象呀!更有如
果單件裡記錄了像使用次數那樣的狀態變數,那情況就更糟糕了。
事實上單件的實現並不比想像中的那樣難。我們且看
class
singlton
public:~
singlton()
static
singlton
&getsinglton()
void
dosomething()
};void
foo(
inti)
class
testsinglton
~testsinglton()
};testsinglton test1;
intmain()
這裡用到的乙個技巧就是使用了靜態的變數,很明顯有如下的好處:
1)如果在此次執行時根本沒有用到單件,對像是不會被建立的。
2)需要使用者來關心物件的釋放
3)完全符合設計要求
關於Python在Powershell裡的應用
1 背景 個人由車輛領域轉行進入人工智慧領域,應相關需求進行 學習,以python 2.7為學習物件,本文章主要描述了個人對相關軟體的歸納及學習筆記。該篇幅針對powershell做相關介紹,包含少許python內容,不斷更新。部分內容參考他人,會在文章末尾進行致謝與說明。個人電腦作業系統採用 wi...
在SSRS 裡實現 SUMIF
最近在做報表時,要實現excel中的sumif的功能,示例 sumif b 2 b 465,east g 2 g 465 即彙總b列值等於east的g列值。在ssrs中,我們想到的一定是iif語句,因此第一次寫的結果一定是 示例 sum iif fields team.value east fiel...
在C 裡怎麼重寫已實現的介面
本文通過虛函式來實現介面在繼承類裡的重寫。實現語言為c 通常如果我們定義了乙個介面如下 inte ce imyinte ce void foo int i 然後我們在類base裡實現了此介面,如下 class myclassbase protected void foo int i private ...