1樓:匿名使用者
你在方法2中可能例項化類1時沒有初始化指標,或者指標為空,程式結束時,呼叫解構函式delete一個野指標或空指標的時候就可能會出錯了,而你把方法1的指標換成物件,在程式結束的時候,即使你沒有清理,編譯器都會幫你釋放空間的,因此不會出錯。
2樓:匿名使用者
自動生成的只會原樣複製。如果你的類裡有一個指標,你給它分配了記憶體,然後在解構函式中釋放記憶體。如果使用自動生成的複製函式會造成重複釋放記憶體。
如果我用了new來分配記憶體 我又使用了 解構函式來釋放記憶體 會怎樣呢?
class c
~c()
private:
char *p;
};c a;
c b(a); //這裡使用系統生成的拷貝建構函式。a.p 與b.p是相同的。a和b的解構函式都會刪除p,就會重複刪除而出錯。
3樓:匿名使用者
關於解構函式的說明:
1。當程式的執行離開例項化自動物件所在的作用域時,自動物件就會撤銷,這時解構函式隱式呼叫.並不是說在main函式結束時才執行。
2。解構函式本身並不釋放物件佔用的記憶體空間,它只是在系統收回物件的記憶體空間之前執行掃尾工作.解構函式體內並不一定要有delete語句。可以有也可以沒
3。和建構函式一樣,每個類都有一個解構函式,即使沒有顯式提供一個解構函式,編譯器也會生成一個空的解構函式 .
補充說明:
離開例項化自動物件所在的作用域這句的意思就是說比如你有一個自定義類和一個自定義函式,你在這個函式裡宣告一個這個類的物件,這個物件就是例項化自動物件,它的作用域僅限於該函式體內,然後你在main函式裡呼叫這個函式,呼叫結束後,那個類的物件就離開了它的作用域,這時,那個類的解構函式就會被編譯器隱式呼叫。
當主函式結束,**記憶體的工作就開始了,但這個工作是由編譯器的記憶體**機制在後臺執行。如果在類的實現中,有動態分配記憶體和動態分配陣列的語句,那麼最好在解構函式裡提供delete語句!
更正二樓的一個觀點,解構函式絕不是在main函式結束時自動執行的!!!!!!
c 解構函式問題,c 解構函式的問題
1 不是不能定義,是定義了沒意義。因為建構函式不被繼承,而虛擬函式是要在派生類中重定義的2 定義虛解構函式後,由於多型,當使用基類指標指向派生類物件時,會呼叫派生類的虛構函式,然後派生類的解構函式自動呼叫基本解構函式。不是虛的話,直接呼叫基類的解構函式了。如果派生類中有用new分配的記憶體,就無法釋...
c中建構函式與解構函式的問題,C 中建構函式與解構函式的問題
你的getname函式在 你的類定義中只有getscore和getid c 關於建構函式和解構函式呼叫次數的問題 沒問題啊。引數傳遞的時候第一次拷貝構造呼叫,在函式返回的時候賦值給c2 再次呼叫了拷貝構造。析構的話 c1 c2 c 三次 傳遞引數和返回引數各一次拷貝建構函式,所以是2次 有兩個物件c...
設計簡單的C 程式,要求包括建構函式,解構函式和複製函
我們課堂上剛練習了,同學,給你吧。include using namespace std class point 拷貝建構函式 friend point move point q 友元函式宣告 point 解構函式int getx int gety void main 建構函式 解構函式與賦值函式是...