詳解析構函數出現的必要性

輸入輸出需要內存!

同學你好,你已經學了用scanf,cin指令進行輸入輸出 。但如果你想輸入一篇英文文章是否也可以用這兩種指令呢?答案是否定的,每臺電腦都會有自己的隨機處理器(RAM),下面是我的電腦參數:
在這裏插入圖片描述
我們可以發現我的電腦有16G的內存,但這16G只會有很小的一部分分給Dev-C++,打開任務管理器內存分配可見一斑,能夠scanf和cin調用的僅約1M左右。在這裏插入圖片描述

傳統C語言應對策略

#include<stdlib.h>          //調用malloc函數的頭文件
s=(char*) malloc(128*sizeof(char));//用malloc函數申請動態內存
free(s);//釋放空間

對代碼的解釋

  • 由於malloc函數返回值爲void,爲空類型指針,而s是字符型指針,直接賦值可能會報錯。故在其前加上強制類型轉換(char*)。
  • 有時候我們不記得申請字符所佔字節數,故這裏使用sizeof();
  • 128*代表申請128個char類型地址空間。
  • 最後動態內存程序結束後並不會自己釋放,造成內存泄漏,需要調用free()進行釋放。

申請動態內存的好處

char m_szname1[25];     //申請長度爲25的char數組
m_szname2=(char*) malloc(255);
char * m_szname2;       //申請一個char類型的指針
free(m_szname2);

對代碼的解釋

  • 第一種方式申請char類型數組會限定其大小,此題m_szname1至多容納25個字符。
  • 第二種申請一個指針,指向一個字符串,則指針不會限定字符串的長度
  • 由於指針必須指向地址,則需提前用malloc申請指針的動態內存。
  • 程序不會自主釋放動態內存,需要調用free進行釋放。

有沒有感覺malloc很厲害

析構函數閃亮登場

什麼是析構函數:

1、析構函數(destructor) 與構造函數相反,當對象結束其生命週期時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數往往用來做“清理善後” 的工作(例如在建立對象時用new開闢了一片內存空間。

2、析構函數如果我們不寫的話,C++ 會幫我們自動的合成一個,就是說:C++ 會自動的幫我們寫一個析構函數。很多時候,自動生成的析構函數可以很好的工作,但是一些重要的事蹟,就必須我們自己去寫析構函數。

3、按照 C++ 的要求,只要有 new 就要有相應的 delete 。這個 new 是在構造函數裏 new 的,就是出生的時候。所以在死掉的時候,就是調用析構函數時,我們必須對指針進行 delete 操作。

析構函數的好處:

他某種程度上類似free()函數,不過是對構造函數申請的動態內存的清理,但我們注意到free()函數的使用是需要人爲判斷人爲調用的,這需要程序編寫者自己判斷什麼時候不再需要申請的動態內存,要求較高。而析構函數會在構造函數結束後由編譯器自行調用,釋放動態內存,可見其優越性。

wuli康康的參考資料

你可以找到更多關於heap,malloc和free的信息,請點 here.
你可以找到更多關於new與delete創建對象的信息,請點 here.

不妥之處請多多指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章