對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務;乙個系統只能有乙個視窗管理器或檔案系統;乙個系統只能有乙個計時工具或id(序號)生成器。如在windows中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這些視窗顯示的內容完全一致,則是重複物件,浪費記憶體資源;如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給使用者帶來誤解,不知道哪乙個才是真實的狀態。因此有時確保系統中某個物件的唯一性即乙個類只能有乙個例項非常重要。從具體實現角度來說,有以下三點:
當類的訪問許可權為私有時,類物件只能在堆上生成,即通過new生成,且不能呼叫delete。c++是乙個靜態繫結語言,在編譯過程中,所有的非虛函式呼叫都必須分析完成(虛函式也要檢查可訪問性)。因此,當在棧上生成物件時,物件會自動析構,即析構函式必須可以訪問。而在堆上生成物件時,析構步驟由程式設計師控制,不一定需要析構函式。同時,此生成物件不能直接delete刪除,析構過程還需要乙個專門的成員函式(destory函式)。
new運算子要做的工作主要是在堆中申請記憶體存放物件(初始化交給物件的建構函式)。與私有析構函式的做法類似,過載new運算子並將其訪問許可權設為私有,可使類物件只能在棧上生成,即不能呼叫new(應同時過載delete並將其訪問許可權設為私有)。過載new運算子還可以跟蹤記憶體的申請和釋放,實現記憶體分配管理和記憶體洩漏檢測。new的過載可分為全域性和區域性(類)兩種,過載的介面為
引數size是物件(陣列)的位元組數,後面可根據需要新增引數(使用__file__和__line__可跟蹤源**)。呼叫有額外引數的new的形式為 new(...) type。注意,在new type(...) 這個形式中,括號中的引數用於初始化type這個型別,而不是呼叫new的過載版本。
C 單例模式及其析構
utilities.h ifndef utilities h define utilities h include class utilities static garbo m garbo endif utilities h utilities.cpp include utilities.h qmu...
單例模式 new
單例模式,使用 new new 是建構函式,init 是初始化方法,先呼叫了 new 返回了例項,init 給這個例項初始化繫結一些屬性。1 class singleton object 23 def new cls,args,kw 4if not hasattr cls,instance 5 cl...
單例析構那點事兒
單例是c 中比較常用的設計模式,在遊戲伺服器開發中很多全域性管理器都是用單例實現。其實單例不析構也不會有任何問題,但是有的時候需要查記憶體洩漏問題那麼單例不析構會導致工具報錯太多,不利於查詢問題。普通單例沒有通用性,在我參與的所有遊戲專案中都是模板單例,網上有很多單例析構的例子,但是我幾乎沒有找到有...