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

2022-03-10 10:34:30 字數 3532 閱讀 9841

1樓:匿名使用者

c++中沒有基函式,子函式的說法。只有基類,繼承類的說法。基類就是父類,繼承類就是子類,繼承類繼承基類的介面和實現。

c++的類析構時,會先呼叫繼承類的析構函式,然後再呼叫基類的析構函式。

2樓:匿名使用者

沒有基函式, 子函式的說法

只有基類和派生類的說法.   或者(父類,子類)構造過程和析構過程是相反的.

構造時, 先構造基類, 再構造派生類為什麼要這麼做呢?  舉個簡單的例子, 派生類類建構函式中呼叫了基類的乙個初函式來獲取基類成員變數的值.  如果基類還沒有構造完成的話, 獲取到的值應該是什麼呢?

所以必須要先構造基類.

析構過程剛好相反,  先析構派生類, 再析構基類.這又是為什麼呢? 同理, 如果派生類析構的時候, 要訪問基類中的乙個成員函式獲取基類成員變數值,  如果基類先析構了, 派生類呼叫得到的什麼是什麼呢?

 比如指標, 肯定變成空或者野指標了.  所以必須先析構派生類

3樓:天雨下凡

先釋放子類的記憶體,再釋放基類的記憶體。

c++析構函式是怎麼釋放記憶體的?

4樓:匿名使用者

你在方法2中可能例項化類1時沒有初始化指標,或者指標為空,程式結束時,呼叫析構函式delete乙個野指標或空指標的時候就可能會出錯了,而你把方法1的指標換成物件,在程式結束的時候,即使你沒有清理,編譯器都會幫你釋放空間的,因此不會出錯。

5樓:匿名使用者

自動生成的只會原樣複製。如果你的類裡有乙個指標,你給它分配了記憶體,然後在析構函式中釋放記憶體。如果使用自動生成的複製函式會造成重複釋放記憶體。

如果我用了new來分配記憶體 我又使用了 析構函式來釋放記憶體 會怎樣呢?

class c

~c()

private:

char *p;

};c a;

c b(a); //這裡使用系統生成的拷貝建構函式。a.p 與b.p是相同的。a和b的析構函式都會刪除p,就會重複刪除而出錯。

6樓:匿名使用者

關於析構函式的說明:

1。當程式的執行離開例項化自動物件所在的作用域時,自動物件就會撤銷,這時析構函式隱式呼叫.並不是說在main函式結束時才執行。

2。析構函式本身並不釋放物件占用的記憶體空間,它只是在系統收回物件的記憶體空間之前執行掃尾工作.析構函式體內並不一定要有delete語句。可以有也可以沒

3。和建構函式一樣,每個類都有乙個析構函式,即使沒有顯式提供乙個析構函式,編譯器也會生成乙個空的析構函式 .

補充說明:

離開例項化自動物件所在的作用域這句的意思就是說比如你有乙個自定義類和乙個自定義函式,你在這個函式裡宣告乙個這個類的物件,這個物件就是例項化自動物件,它的作用域僅限於該函式體內,然後你在main函式裡呼叫這個函式,呼叫結束後,那個類的物件就離開了它的作用域,這時,那個類的析構函式就會被編譯器隱式呼叫。

當主函式結束,**記憶體的工作就開始了,但這個工作是由編譯器的記憶體**機制在後台執行。如果在類的實現中,有動態分配記憶體和動態分配陣列的語句,那麼最好在析構函式裡提供delete語句!

更正二樓的乙個觀點,析構函式絕不是在main函式結束時自動執行的!!!!!!

c++呼叫析構函式後,對像是被銷毀了不存在了嗎,還是說只釋放了記憶體?那為什麼物件的成員變數還可以使用?

7樓:匿名使用者

物件是被銷毀了不存在了,物件的」遺體「是否可用就不知道了……

8樓:蝶翼的罪

個人理解:只是物件在記憶體中的標記變成了自由記憶體,也就是說以後分配記憶體就可以把這塊記憶體就當作空間再次分配了,而對物件的成員變數呼叫,實際上本質是該物件對應的記憶體位址加上變數偏移位址的引用。類似的比如在堆中分配了一塊記憶體,用指標指向,但是如果**了記憶體,但是指標還是儲存著記憶體的位址,所以還是可以呼叫,但是這塊記憶體隨時可以隨時被分配作他用。

c++派生類的析構函式是如何工作的?

9樓:匿名使用者

析構函式是類在釋放時執行清理工作的地方,清理過程主要包含兩個部分,一是系統自動執行的部分,其機制是先呼叫基類的析構函式,讓基類清除自己的資源,再呼叫類內部包含的物件的析構函式,其中這兩種呼叫過程都是遞迴進行的,直到最頂層的類;還有一種是由使用者**執行清理的,這種往往是使用者自己管理的資源,如動態申請的記憶體,系統的檔案控制代碼,網路埠等。

10樓:匿名使用者

先呼叫自己的析構函式,再物件成員的,最後基類的

11樓:匿名使用者

這個要分情況,特別是在多型的時候更要小心

一般情況下就像你說的,先自己析構再基類析構,但是如果你**中存在多型行為,析構就要看基類的析構函式是否定義成vritual了,如果沒有就只呼叫基類析構,如下:

class a

;~a(){}

};class b : public a

;~b(){};

};如果你的**只是:

b *b = new b; delete b;那是肯定先調b的析構,然後調a的析構

但是如果是這樣的多型形式

a *a = new b; delete a; 這個時候的析構只呼叫了基類a的析構,如果把a的析構函式定義成virtual的,那就會先調b的析構,然後調a的,所以涉及到繼承的,最好把父類的析構函式定義成vritual形式

12樓:學無止境分享無限

當構造乙個派生類物件是,會先依次呼叫父類建構函式,然後在呼叫派生類建構函式;

當派生類物件被釋放時,會以相反的順序執行析構函式(也就算先執行派生類析構函式,然後依次向上執行父類析構函式),

首先,注意這裡的析構函式釋放的記憶體,指的並不是該物件的成員變數所佔記憶體(物件成員變數所佔記憶體是有編譯器分配,存在於系統堆疊中,當函式退出後,就會不存在,否則一直都在,當然也許並沒有被使用),析構函式釋放的記憶體,一般指的是該物件成員函式中使用的動態申請記憶體,自己主動釋放!

望採納!

c++程式子類析構時會呼叫父類的析構函式麼?

13樓:東哥

c++程式子類析構時會呼叫父類的析構函式。

析構函式呼叫的次序是先派生類的析構後基類的析構,也就是說在基類的的析構呼叫的時候,派生類的資訊已經全部銷毀了定義乙個物件時先呼叫基類的建構函式、然後呼叫派生類的構造 函式;析構的時候恰好相反:先呼叫派生類的析構函式、然後呼叫基類的析構函式。

析構函式:

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

14樓:

構造的時候要構造父類,那麼析構的時候也要析構父類了……

15樓:匿名使用者

先呼叫自身再呼叫父類

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

有點偏頗.析構函式 是在你的類執行 結束後 再執行的方法。釋放資源只的他的乙個作用之一。必須說這類執行結束了,你操作其它的類或者其它的內容就用到它了。釋放資源只是它作用一種。如果是託管了,系統就會自己幫你釋放的。不過有的程式設計師控制能力比較強,託管的也自己來操作釋放。這樣可以系統資源最大話利用。析...

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

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

c 析構函式何時會被呼叫,C 析構函式何時會被呼叫?

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