關於SINGLTON在C 裡實現 zz

2021-04-16 22:24:17 字數 2407 閱讀 6581

在《設計模式》中有乙個叫做單件(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 ...