對C 中動態記憶體分配的認識

2021-06-28 07:28:28 字數 1470 閱讀 9581

動態記憶體分配需要兩個關鍵字:new和delete。

1 new

new 用來申請記憶體,這個過程稱為建立。

宣告形式:

new 資料型別(引數);    (一二適用)

這個語句返回乙個指向記憶體首位址的指標。

2 delete

宣告形式:

delete 指標名;     (一二適用)

delete 用來刪除new分配的動態記憶體空間,這叫做釋放。

如果是物件,則會呼叫析構函式。

delete 只能用一次,多次使用會出現執行錯誤。

一:基本資料型別的變數的動態記憶體分配

舉個例子:

new int(2);

就宣告了乙個整形的資料2,並為它分配記憶體空間,返回乙個指標。

注意:若沒有初值,則要把園括號去掉就行了。如果還有圓括號,但是裡邊沒有值,這時會用0賦值給它。

二:類型別的物件的動態記憶體分配

如果是類型別的話,則要呼叫建構函式進行初始化操作,再分配記憶體空間,返回乙個指標。

注意:舉個例子,new point和new point()的區別:1 當使用者定義了預設建構函式時,這兩個形式是一樣的,都將呼叫這個預設建構函式進行賦值操作。2 當沒有定義預設建構函式時,前者將呼叫系統的預設建構函式,後者除了呼叫系統的預設建構函式外,還會用0初始化物件的基本資料型別的成員和指標型別的成員,不太一樣。

三記憶體洩漏

當使用過new 動態分配記憶體後,必須用delete進行刪除操作,否則就會使資料佔據的記憶體空間越來越多,可使用的記憶體空間越來越少,這種情況叫做記憶體洩漏。

總之,用new 分配記憶體空間後,一定要用delete進行刪除操作。

四陣列型別的動態記憶體分配(一維陣列)

宣告形式:

new 資料型別[元素個數];

如果是基本資料型別,後邊要不要()都可以,都是用0初始化。

如果是類型別,分兩組情況:1 如果有使用者定義的預設建構函式,則要不要都一樣,都會呼叫這個預設建構函式。2 如果沒有定義預設建構函式,則沒有()表示呼叫系統的預設建構函式,有()表示除了呼叫系統的預設建構函式外,還要將物件的基本資料型別的資料和指標型別的資料賦值0。

例如:new int [2];

就宣告了乙個整型的陣列,動態分配記憶體。

五多維陣列的動態記憶體分配

宣告形式:

new 資料型別[陣列長度][陣列長度]……

第乙個陣列長度可以是乙個結果為整數的表示式,後邊的陣列長度必須是結果為整數的表示式。

注意:多維陣列的動態記憶體分配會返回乙個陣列型別的指標,舉個例子:

newfloat[8][9][8];

float (*p1)9][8];

p1=newfloat[8][9][8];

如果指標寫成:float *p2

p2=new float[8][9][8];

就錯了。因為p2是浮點型的指標變數,而p1是對應陣列型別的指標,剛好匹配。

以上就是我對於動態記憶體分配的一些認識。

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C 中的動態記憶體分配

常見的程式崩潰的原因 由assert 觸發的 操作記憶體時,越界了 記憶體沒有被初始化就拿去用了 棧溢位了 使用了野指標。總之,非法操作記憶體會對引起程式崩潰。c中動態記憶體管理方式 使用malloc calloc realloc free進行動態記憶體管理。malloc calloc reallo...

C 中的動態記憶體分配

目錄 為什麼分配動態記憶體?堆的別名 空閒儲存器 new 和 delete 操作符 為陣列動態分配記憶體 在程式中處理固定數量的變數,這樣的應用非常有限。經常需要在執行期間根據程式的輸入資料來決定應給儲存不同型別的變數分配的空間量。例如,如果需要儲存乙個班的學生資訊,由於學生數目不固定,學生的名字長...