C 基礎 動態記憶體開闢new delete

2021-07-15 06:05:57 字數 2082 閱讀 8302

動態記憶體開闢new_delete

new作用:

1.申請空間

2.調動建構函式初始化物件

delete作用:

1.調動析構函式析構物件

2.釋放空間

通常定義變數(或物件),編譯器在編譯時都可以根據該變數(或物件)的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確定的儲存空間。這種記憶體分配稱為靜態儲存分配

有些操作物件只有在程式執行時才能確定,這樣編譯器在編譯時就無法為他們預定儲存空間,只能在程式執行時,系統根據執行時的要求進行記憶體分配,這種方法稱為動態儲存分配。所有動態儲存分配都在堆區中進行。

當程式執行到需要乙個動態分配的變數或物件時,必須向系統申請取得堆中的一塊所需大小的存貯空間,用於存貯該變數或物件。

當不再使用該變數或物件時,也就是它的生命結束時,要顯式釋放它所占用的存貯空間,這樣系統就能對該堆空間進行再次分配,做到重複使用有限的資源。

在c++中,申請和釋放堆中分配的存貯空間,分別使用new和delete的兩個運算子來完成,

其使用的格式如下:

型別名 指標變數名 = new 型別名(初始化式);

delete 指標變數名;

int *pi=new int(0);  //用初始化式來顯式初始化:

delete pi;     //當pi生命週期結束時,

必須釋放pi所指向的目標

注意這時釋放了pi所指的目標的記憶體空間,也就是撤銷了該目標,稱動態記憶體釋放,但指標pi本身並沒有撤銷。

對於陣列進行動態分配的格式為:

型別名 指標變數名=new 型別名[下標表示式];

delete [ ]指標變數名;

int *pi = new int[10];  //建立乙個int型別的陣列

delete pi;             //刪除陣列

兩式中的方括號是非常重要的,兩者必須配對使用。如果delete語句中少了方括號,因編譯器認為該指標是指向陣列第乙個元素的指標,會產生**不徹底的問題(只**了第乙個元素所佔空間),加了方括號後就轉化為指向陣列的指標,**整個陣列。

delete [ ]的方括號中不需要填陣列元素數,系統自知。即使寫了,編譯器也忽略。

例子:

class test

~test()

{}private:

int data;

}int main()

強調:由堆區建立物件陣列,只能呼叫預設的建構函式,不能呼叫其他任何建構函式。

如果沒有預設的建構函式,則不能建立物件陣列。

malloc和free與new和delete的區別:

c語言中的malloc只負責申請空間,free只負責釋放空間

c++語言中的new不僅負責空間的申請,還負責為物件初始化,

delete不僅負責空間的釋放,之前還要析構物件

指標使用的幾個問題:

1.動態分配失敗。返回乙個空指標(null),表示發生了異常,堆資源不足,分配失敗。

2.指標刪除與堆空間釋放。刪除乙個指標p(delete p;)實際意思是刪除了p所指的目標(變數或物件等),

釋放了它所佔的堆空間,而不是刪除p本身,釋放堆空間後,p成了空懸指標。

3.記憶體洩漏(memory leak)和重複釋放。new與  delete 是配對使用的, delete只能釋放堆空間。

如果new返回的指標值丟失,則所分配的堆空間無法**,稱記憶體洩漏,同一空間重複釋放也是危險的,

因為該空間可能已另分配,所以必須妥善儲存new返回的指標,以保證不發生記憶體洩漏,也必須保證不會重複釋放堆記憶體空間。

4.動態分配的變數或物件的生命期。無名物件的生命期並不依賴於建立它的作用域,

比如在函式中建立的動態物件在函式返回後仍可使用。我們也稱堆空間為自由空間(free store)就是這個原因。

但必須記住釋放該物件所佔堆空間,並只能釋放一次,在函式內建立,而在函式外釋放是一件很容易失控的事,往往會出錯。

C動態記憶體開闢

動態記憶體開闢 malloc calloc realloc 都是在堆上申請空間 一 malloc和free void malloc size t size 動態開闢記憶體 include include include int main int ptr int malloc 10 sizeof in...

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如全域性變數,static變數 2.從棧空間分配,函式呼叫完其被自動釋放 3.從堆空間分配,即動態記憶體開闢,比如 malloc,calloc,realloc,何時申請何時釋放 malloc 函式原型void malloc s...

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如說全域性變數,static變數 2.從棧空間分配,函式呼叫完成後被自動釋放 3.從對空間分配,即動態記憶體開闢,比如malloc,calloc,realloc malloc calloc realloc和free mallo...