C 動態分配(new和malloc的用法及區別)

2021-10-19 15:49:29 字數 3368 閱讀 1058

參考:

一、malloc和free

1、函式宣告:

void *malloc(int size);

說明:malloc向系統申請分配size位元組的記憶體空間,返回型別為void*型別;

2、使用

int

* p;

p =(

int*

)malloc

(sizeof

(int))

;free

(p);

//釋放記憶體

malloc函式使用注意:

1)、malloc返回的是不確定型別的指標,因此在返回前需要做強制型別轉換,否則將編譯錯誤;

2)、malloc只管分配記憶體,並不會初始化,其記憶體空間中的值可能是隨機的。如果分配的這塊空間原來沒有被使用過,那麼其中每個值都可能是0。相反,空間裡面可能遺留各種各樣的值。

3)、實參為需要分配的位元組大小,如果malloc(1),那麼系統只分配了1個位元組的記憶體空間,這時注意,如果在這塊空間中存放乙個int值,由於int型別佔4個位元組,那麼還有3個位元組未分配空間,系統就會在已經分配的那1個位元組的基礎上,依次向後分配3個位元組空間,而這就占有了「別人」的3個位元組空間,「別人」原有的值就被清空了。

4)、分配的空間不再使用時,要用free函式釋放這塊記憶體空間。

5)、釋放的是指標指向的記憶體空間而不是指標本身,釋放後指標仍然存在,(諸如像指標這種變數,只有在程式結束時才會被銷毀)如:

int

* p;

p =(

int*

)malloc

(sizeof

(int))

;free

(p);

int a =10;

p =&a;

//指標依舊存在且可以被賦值

3、malloc函式工作機制

1)malloc函式被呼叫時,malloc函式沿空閒鍊錶(存在於記憶體的堆裡)尋找乙個滿足需求的記憶體塊,然後把所需大小的記憶體塊分配給使用者,剩下的返回到鍊錶上。

2)呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。

3)在malloc函式被呼叫或多次呼叫後,空閒鍊錶會被分成很多小的記憶體片段,當使用者申請一塊較大的記憶體空間時,空閒鍊錶上可能沒有滿足需求的記憶體塊了,這時,malloc函式請求延時,並將空閒鍊錶內的小記憶體片段整理成大的記憶體塊,最終返回。

4)如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。

二、new和delete

1、new

1)格式:

new 型別名t(初始化引數列表)

2)功能:

在程式執行期間,申請用於存放t型別物件的記憶體空間,並依初始值列表賦以初值。

3)結果:

成果-》t型別的指標指向新分配的記憶體;

失敗-》丟擲異常。

例:

//開闢單位址空間

int*p =

newint

;//開闢大小為sizeof(int)空間

int*q =

newint(5

);//開闢大小為sizeof(int)的空間,並初始化為5。

//開闢陣列空間

//一維

int*a =

newint

[100];

//開闢大小為100的整型陣列空間,並初始化為0。

//二維

int(

*a)[6]

=new

int[5]

[6];

//三維

int(

*a)[5]

[6]=

newint[3

][5]

[6];

//四維及以上以此類推。

2、delete

1)格式:

delete 指標p

2)功能:

釋放指標p所指向的記憶體

p必須是new操作的返回值

3)例:

//釋放單個int空間

int*a =

newint

;delete a;

//釋放int陣列空間

int*b =

newint[5

];delete

b;

三、兩者區別

1、屬性

new和delete是c++關鍵字,需要編譯器支援;malloc和free是庫函式,需要標頭檔案支援。

2、引數

使用new操作符申請記憶體分配時無須指定記憶體塊的大小,編譯器會根據型別資訊自行計算。而malloc則需要顯式地指出所需記憶體的尺寸。

3、返回型別

new操作符記憶體分配成功時,返回的是物件型別的指標,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。而malloc記憶體分配成功則是返回void * ,需要通過強制型別轉換將void*指標轉換成我們需要的型別。

4、自定義型別

new會先呼叫operator new函式,申請足夠的記憶體(通常底層使用malloc實現)。然後呼叫型別的建構函式,初始化成員變數,最後返回自定義型別指標。delete先呼叫析構函式,然後呼叫operator delete函式釋放記憶體(通常底層使用free實現)。

malloc/free是庫函式,只能動態的申請和釋放記憶體,無法強制要求其做自定義型別物件構造和析構工作。

5、過載

c++允許自定義operator new 和 operator delete 函式控制動態記憶體的分配。

6、記憶體區域

new做兩件事:分配記憶體和呼叫類的建構函式,delete是:呼叫類的析構函式和釋放記憶體。而malloc和free只是分配和釋放記憶體。

new操作符從自由儲存區(free store)上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體。自由儲存區是c++基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體動態分配,c語言使用malloc從堆上分配記憶體,使用free釋放已分配的對應記憶體。自由儲存區不等於堆,如上所述,布局new就可以不位於堆中。

7、分配失敗

new記憶體分配失敗時,會丟擲bac_alloc異常(要用try-catch)。malloc分配記憶體失敗時返回null。

8、記憶體洩漏

記憶體洩漏對於new和malloc都能檢測出來,而new可以指明是哪個檔案的哪一行,malloc確不可以。

malloc和new動態分配這些事

未完待續 malloc 是c語言中動態儲存管理的一組標準庫函式之一。其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值是乙個指向所分配的連續儲存域的起始位址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間 如記憶體不足 就會返回乙個null指標。...

mallco動態分配 malloc動態分配多維陣列

下面試自己寫的三個測試程式,如果看懂了基本上動態分配多維陣列就沒什麼問題啦 重點 1 深刻理解多維陣列的概念,多維陣列在記憶體中的分配情況,基本上動態分配也沒什麼問題的。然後還要注意一點的就是,釋放是分配的逆過程!include include include void main void int ...

C語言如何動態分配空間 malloc

一般的變數在定義是就要確定大小,但是有的時候不知道使用者的需要,就比如說排序,你不知道使用者想要給幾個數排序,所以為了保險起見往往是定義乙個很大的變數,而實際上使用者可能只需要給5個數排序,你卻int k 1024 來存放要排序的數,造成極大的浪費。這裡介紹乙個函式用於動態分配空間 malloc 原...