天天看點

C++--記憶體管理與釋放C++--記憶體管理與釋放

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

繼續閱讀