C 中的析構函式

2022-03-02 18:04:00 字數 3354 閱讀 9766

在企業應用開發世界,效能,靈活性和安全性是最重要的。我作為乙個vc++程式設計師開始我的職業生涯,並且在乙個晴朗的早晨,我被轉到了web開發部。像每個c++程式設計師一樣,我也很失落。我想每個像tom,dick甚至harry能用html程式設計。然而,不久我就發現真正的挑戰是生產高效能的,靈活的可靠的應用程式。綜上所述,web環境松耦合的,不分國界的本質將使你永遠神往。

為了製作高效能的靈活的應用程式,用最優化的方式使用你的資源是至關重要的。乙個技巧是盡可能晚地使用你的資源並且在使用後盡快釋放它。我在這裡的意圖是描述在c#中的物件清除機制。

解構器

我們知道,『解構器』被用來清除類的事例。當我們在

c#中使用解構器是,我們必須記住以下幾點:

下面是類

myclass

解構器的乙個宣告:

~ myclass() 

// cleaning up code goes here

}程式設計師不能控制解構器何時將被執行因為這是由垃圾收集器決定的。垃圾收集器檢查不在被應用程式使用的物件。它認為這些條件是符合清楚的並且收回它們的記憶體。解構器也在程式退出時被呼叫。當解構器執行時其背後所發生的那一幕是解構器隱式呼叫物件基類的object.finalize方法。因此上述解構器**被隱含轉化成:

protected

override

void

finalize()

finally

}現在,讓我們看乙個解構器怎樣被呼叫的例子。我們有三個類a,

b和c。

b派生自a,

c派生自

b。每個類有它們自己的構造器和解構。在類

的main

函式中,我們建立c的

物件。using

system;

class

a~a()

}

class

b:a

~b()

}

class

c:b

~c()

}

class

}

正如我們預料的,基類的構造器將會被執行並且程式會等待使用者按『enter』。當這個發生,我們把類c的物件置為null.但解構器沒有被執行..!!??正像我們所說的,程式設計師無法控制解構器何時被執行因為這是由垃圾蒐集器決定的。但程式退出時解構器被呼叫了。你能通過重定向程式的o/p到文字檔案來檢查這個。我將它輸出在這裡。注意到基類的解構器被呼叫了,因為在背後base.finalize()被呼叫了。

creating a

creating b

creating c

object created 

press enter to destroy it

destroying c

destroying b

destroying a

所以,如果一旦你使用完物件你就想呼叫解構器,你該怎麼做?有兩個方法:
呼叫垃圾蒐集器

你能通過呼叫gc.collect方法強制垃圾蒐集器來清理記憶體,但在大多數情況下,這應該避免因為它會導致效能問題。在上面的程式中,在gc.collect()處移除注釋。編譯並執行它。現在,你能看到解構器在控制台中被執行了。

實現idisposable介面

idisposable 介面包括僅有的乙個公共方法,其宣告為void dispose()。我們能實現這個方法來關閉或釋放非託管資源如實現了這個介面的類事例所控制的檔案,流,和控制代碼等。這個方法被用做所有任務聯合物件的資源釋放。當實現了這個方法,物件必須尋求確保所有擁有的資源被繼承結構中關聯的資源也釋放(不能把握,翻不出來)。

class

myclass:idisposable

}

當我們實現了idisposable

介面時,我們需要規則來確保dispose

被適當地呼叫。

聯合使用解構器和

idisposable

介面

public class

myclass:idisposable

protected

void

dispose(bool

diposing)

//clean up unmanaged resources

}isdisposed=true;}

~myclass()

}

在這裡過載了

dispose(bool)

來做清理工作,並且所有的清理**都僅寫在這個方法中。這個方法被解構器和

idisposable.dispose()

兩著呼叫。我們應該注意

dispose(bool)

沒有在任何地方被呼叫除了在

idisposable.dispose()

和解構器中。

當乙個客戶呼叫idisposable.dispose()

時,客戶特意地想要清理託管的和非託管資源,並且因此完成清理工作。有一件你必須注意的事情是我們在清理資源之後立即呼叫了gc.supressfinalize(this)

。這個方法通知垃圾蒐集器不需要呼叫解構器,因為我們已經做了清理。

注意上面的例子,解構器使用引數false

呼叫dispose

。這裡,我們確信垃圾蒐集器蒐集了託管資源。我們僅僅做非託管資源的清理。

結論

儘管如此我們花費一些時間實現idisposable

介面,如果客戶不能合適地呼叫它們會怎樣?為此c#有乙個酷的解決方案。『using

』**塊。它看起來像這樣:

using

(myclass objcls =new

myclass())

當控制從using

塊通過成功執行到結束或者丟擲異常退出時,myclass

的idispose.dispose()

將會被執行。記住你例示的物件必須實現system.idisposable

介面。using

語句定義了哪個物件將被清除的乙個範圍。

C 中的析構函式

概念 析構函式執行與建構函式相反的操作 建構函式初始化物件的非static的資料成員,析構函式則是釋放物件所用的資源,並銷毀物件的非static資料成員。特徵 析構函式的名字是由波浪線接類名構成,他沒有返回值,也不接受引數,所以析構函式不能被過載。注意 析構函式和建構函式相同,建構函式有乙個函式體和...

C 中的析構函式

析構函式 析構函式 destructor 與建構函式相反,當物件脫離其作用域時 例如物件所在的函式已呼叫完畢 系統自動執行析構函式。析構函式往往用來做 清理善後 的工作 例如在建立物件時用new開闢了一片記憶體空間,應在退出前在析構函式中用delete釋放 以c 語言為例,析構函式名也應與類名相同,...

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...