C++--記憶體管理與釋放
1、為一個資料對象(可以是結構,也可以是基本類型)獲得并指定配置設定記憶體的通用格式如下:
typename * pointer_name = new typename;
2、堆和棧的差別:
棧區(stack),由編譯器自動配置設定釋放,存放函數的參數值,局部變量的值等。操作方式類似于資料結構中的棧,速度較快。
堆區(heap),一般由程式員配置設定釋放,若程式員不釋放,程式結束時由作業系統回收。它不是資料結構中的堆,配置設定方式類似于連結清單。一般速度比較慢,而且容易産生記憶體碎片。C中使用malloc函數在堆上配置設定記憶體,
char* p1=(char *)malloc(10);//由free釋放
C++中用new運算符在堆上配置設定記憶體
char* p2=new char[10];//由delete[]釋放
p1,p2本身是在棧中的,它們指向在堆上配置設定的記憶體。
一定要配對地使用new和delete,否則将發生記憶體洩露,也就是說,被配置設定的記憶體再也無法使用了。如果記憶體洩露嚴重,則程式将由于不斷尋找更多記憶體而終止。
3、在編譯時給數組配置設定記憶體稱為靜态聯編,在程式運作時建立的數組稱為動态數組,此時為動态聯編。
4、每一個程式在執行時都占用一塊可用的記憶體空間,用于存放動态配置設定的對象,此記憶體空間稱為程式的自由存儲區或堆。
5、動态建立對象如果不提供顯式初始化,那麼對于類類型的對象,用該類的預設構造函數初始化;而内置類型的對象則無初始化。
6、在回收用new配置設定的單個對象的記憶體空間時用delete,回收用new[]配置設定的一組對象的記憶體空間時用delete[]。
7、C++允許動态建立const對象:
const int *pci = new const int(1024);
對于類類型的const動态對象,如果該類提供了預設的構造函數,則此對象可隐式初始化。
8、malloc/free與new/delete的差別:
相同點:都可用于申請動态記憶體和釋放記憶體。
不同點:
1)malloc與free是C/C++語言的标準庫函數,new/delete是C++的運算符。
2)new自動計算需要配置設定的空間,而malloc需要手工計算位元組數;
3)new是類型安全的,而malloc不是。
4)new調用operator new配置設定足夠的空間,并調用相關對象的構造函數,而malloc不能調用構造函數;delete将調用該執行個體的析構函數,然後調用類的operator delete,以釋放該執行個體占用的空間,而free不能調用析構函數;
5)malloc/free需要庫檔案支援,new/delete則不需要。
9、C++有3種管理資料記憶體的方式:
1)自動存儲:在函數内部定義的正常變量使用自動存儲空間,被稱為自動變量,通常存儲在棧中,後進先出。
2)靜态存儲:使變量成為靜态的方式有兩種:一種是在函數外面定義它,另一種是在聲明變量時使用關鍵字static;
3)動态存儲
原文位址https://blog.csdn.net/qq_38224589/article/details/81587724