C什麼時候需要用到析構函式,C 中析構函式具體是什麼時候被呼叫

2022-03-31 03:43:45 字數 4688 閱讀 8835

1樓:匿名使用者

有點偏頗.

析構函式 是在你的類執行【結束後】再執行的方法。

釋放資源只的他的乙個作用之一。

必須說這類執行結束了,你操作其它的類或者其它的內容就用到它了。

釋放資源只是它作用一種。

-------------------------------如果是託管了,系統就會自己幫你釋放的。

不過有的程式設計師控制能力比較強,託管的也自己來操作釋放。

這樣可以系統資源最大話利用。

2樓:匿名使用者

析構函式 處理一些在物件釋放時候的操作,釋放資源是其中一種,

有乙個類,在釋放的時候,要對另外乙個類進行賦值之類的操作,比如a類釋放的時候,b中記錄當前a物件的數量,則在a類釋放時候 析構函式中更新b中的這個數量,大概這種操作

3樓:匿名使用者

更準確的說應該是 用於釋放非.net框架內的資源 如作業系統的資源物件,網路連線,視窗,資料庫連線

其實.net框架 已經提供了object.finalize方法 清理這些資源

但是為什麼又要用析構函式呢?賣個關子...

4樓:匿名使用者

c#自身有垃圾**機制的,不過你覺得c#自動**不放心,可以自己手動把資源**掉,效能上沒有多大差別的。

c#中析構函式具體是什麼時候被呼叫

5樓:匿名使用者

當記憶體物件不用閒置,並且垃圾**器空閒的時候才會呼叫這個函式

6樓:正牌小卡

乙個西狗對應乙個物件,他於建構函式是成對出現的,並且他的呼叫順序與建構函式正好相反

垃圾**一般要選擇你不引用該物件的時候,並且gc要有閒時間來做這件事

7樓:七終多

2個物件 當然要呼叫2次 析構

8樓:來自天門寺靈巧的華山松

假設你的**是這樣

到下面的大括號時,棧上的n_farmer和m_farmer被銷毀,所以堆裡的兩個物件才有可能給gc**,如果是c++之類的語言,應該是先銷毀m_farmer 後銷毀n_farmer(後進先出)。 所以不可能是先構造乙個n_farmer,然後馬上就銷毀了n_farmer 。

還有,我們只能知道gc會**這兩個物件,但在.net中,由於gc的存在,究竟何時呼叫析構函式我們是不能確認的。

9樓:匿名使用者

好像與垃圾**有關?

c#析構函式何時執行

10樓:墜短綻罷

a和c的作用域都是整個main函式中也可以說是整個程式!顯示a的有引數構造然後是b的有引數構造b的析構-----------b的作用域只在特定的函式中,函式結束,b就會析構!c的有參構造c的析構a的析構程式執行結束!

~其實先構造的後解析,是棧的先進後出的原理,所有的函式的呼叫都會將引數入棧和區域性變數入棧!出棧的時候是相反的順序!

在c#中請問什麼是析構函式和建構函式?

11樓:茂林修豬

析構函式 (destructor) 是一種用於實現銷毀類例項所需操作的成員。析構函式不能帶引數,不能具有可訪問性修飾符,也不能被顯式呼叫。垃圾**期間會自動呼叫所涉及例項的析構函式。

垃圾**器在決定何時**物件和執行析構函式方面允許有廣泛的自由度。具體而言,析構函式呼叫的時機並不是確定的,析構函式可能在任何執行緒上執行。由於這些以及其他原因,僅當沒有其他可行的解決方案時,才應在類中實現析構函式。

析構函式是自動呼叫的,它不能被顯式呼叫。當任何**都不再可能使用乙個例項時,該例項就符合被銷毀的條件。此後,它所對應的例項析構函式隨時均可能被呼叫。

銷毀乙個例項時,按照從派生程度最大到派生程度最小的順序,呼叫該例項的繼承鏈中的各個析構函式。析構函式可以在任何執行緒上執行。

using system;

class a

}class b: a

}class test

}這個用得不多,一般情況都是自動記憶體管理,我們不需要干預,記住這個符號~

而建構函式很重要的,用得挺多的,引數不同,上面的例子把~去點就是建構函式。很典型的無參建構函式

12樓:職場導師小周

建構函式與析構函式雖然是乙個類中形式上較簡單的函式,但它們的使用決非看上去那麼簡單,因此靈活而正確的使用建構函式與析構函式能夠幫你更好的理解clr的記憶體管理機制,以及更好的管理系統中的資源。

建構函式的名字不能隨便起,必須讓編譯器認得出才可以被自動執行。它的命名方法既簡單又合理:讓建構函式與類同名。

除了名字外,建構函式的另乙個特別之處是沒有返回值型別,這與返回值型別為void的函式不同。如果它有返回值型別,那麼編譯器將不知所措。在你可以訪問乙個類的方法、屬性或任何其它東西之前, 第一條執行的語句是包含有相應類的建構函式。

甚至你自己不寫乙個建構函式,也會有乙個預設建構函式提供給你。

析構函式是實現銷毀乙個類的例項的方法成員。析構函式不能有引數,不能任何修飾符而且不能被呼叫。由於析構函式的目的與建構函式的相反,就加字首『~』以示區別。

雖然c#(更確切的說是clr)提供了一種新的記憶體管理機制---自動記憶體管理機制(automatic memory management),資源的釋放是可以通過「垃圾**器」 自動完成的,一般不需要使用者干預,但在有些特殊情況下還是需要用到析構函式的,如在c#中非託管資源的釋放。

資源的釋放一般是通過"垃圾**器"自動完成的,但具體來說,仍有些需要注意的地方:

1. 值型別和引用型別的引用其實是不需要什麼"垃圾**器"來釋放記憶體的,因為當它們出了作用域後會自動釋放所佔記憶體,因為它們都儲存在棧(stack)中;

2. 只有引用型別的引用所指向的物件例項才儲存在堆(heap)中,而堆因為是乙個自由儲存空間,所以它並沒有像"棧"那樣有生存期("棧"的元素彈出後就代表生存期結束,也就代表釋放了記憶體),並且要注意的是,"垃圾**器"只對這塊區域起作用;

13樓:匿名使用者

樓上幾位是都複製的 別誤導樓主了

建構函式

class a()

}當你在程式種出現 a a=new a();的時候 程式自動執行 建構函式

a()而析構函式 的寫法是

~a() {} 意思是 **系統不用的記憶體但是 c#裡 有垃圾自動** 所以 析構函式 基本不用 在c++用的比較多接分

14樓:

看msdn,比誰說的都清楚

析構函式和建構函式不是c#的專利

lz最好弄清楚程式設計的基礎才行

15樓:玫瑰屑風

析構函式 **資源

建構函式 初始化例項

在c#中什麼叫析構函式,怎麼用啊?舉個列啊,謝謝!!!

16樓:匿名使用者

c#中用不到析構函式吧,他自己會**用完的物件的,

c++中一定要用到,形式為 ~function()

17樓:

多數情況下c#中用不到析構函式,但如果在class中啟用了非託管性資源,那麼建議在其析構函式中進行適當資源清理工作(此時結合dispose模式會更好),這會使.net的自動垃圾**和手動處理協調配合起來。

凡具有析構函式的class,其被識別為垃圾後,垃圾**機制不會簡單的進行**處理,而是會將其加入到終結佇列,再由第三方執行緒(因與主線程不存在資料衝突,故彼此可非同步執行,不至應垃圾**執行緒誤了主程式的事)執行。編寫析構函式要注意重點在清理非託管性資源,且不可將垃圾復活。

18樓:匿名使用者

system.web.ui.page

19樓:落紅玉樹花生

析構函式用於析構類的例項。

1、不能在結構中定義析構函式。 只能對類使用析構函式。

2、乙個類只能有乙個析構函式。

3、無法繼承或過載析構函式。

4、無法呼叫析構函式。 它們是被自動呼叫的。

5、析構函式既沒有修飾符,也沒有引數。

例如:下面是類car的析構函式的宣告:

class car

}該析構函式隱式地對物件的基類呼叫 finalize。 這樣,前面的析構函式**被隱式地轉換為以下**:

protected override void finalize()finally

}這意味著對繼承鏈中的所有例項遞迴地呼叫 finalize 方法(從派生程度最大的到派生程度最小的)。

再舉個例子:

下面的示例建立三個類,這三個類構成了乙個繼承鏈。 類 first 是基類,second 是從 first 派生的,而 third 是從 second 派生的。 這三個類都有析構函式。

在 main() 中,建立了派生程度最大的類的例項。 注意:程式執行時,這三個類的析構函式將自動被呼叫,並且是按照從派生程度最大的到派生程度最小的次序呼叫。

class first

}class second : first}class third : second}class testdestructors}/* output (to vs output window):

third's destructor is called.

second's destructor is called.

first's destructor is called.

*/希望可以幫到你~~

c 中析構函式可以實現什麼,c 中的虛擬析構函式有什麼作用?

析構函式名與類名相同,只是在函式名前面加乙個位取反符 例如 stud 以區別於建構函式。它不能帶任何引數,也沒有返回值 包括void型別 只能有乙個析構函式,不能過載。如果使用者沒有編寫析構函式,編譯系統會自動生成乙個預設的析構函式 即使自定義了析構函式,編譯器也總是會為我們合成乙個析構函式,並且如...

C 中析構函式是先執行子函式還是基函式的記憶體釋放

c 中沒有基函式,子函式的說法。只有基類,繼承類的說法。基類就是父類,繼承類就是子類,繼承類繼承基類的介面和實現。c 的類析構時,會先呼叫繼承類的析構函式,然後再呼叫基類的析構函式。沒有基函式,子函式的說法 只有基類和派生類的說法.或者 父類,子類 構造過程和析構過程是相反的.構造時,先構造基類,再...

什麼時候需要用均值不等式,什麼時候需要用均值不等式

求最值,特別是定義域是 0,正無窮 的最值,證明最值時也可用 但少用 什麼時候用均值不等式?謝謝解答 使用均值不等式有條件的 一正二定三相等 1都是正數 2和為定值求積or積為定值求和 問下均值不等式是什麼?什麼時候用?1調和平均數hn n 1 a1 1 a2 1 an 2幾何平均數gn a1a2....