C和C 中動態分配和釋放記憶體的方式及其區別

2021-07-22 04:05:58 字數 2099 閱讀 4977

c和c++中動態分配和釋放記憶體的方式及其區別

1、c和c++中動態分配和釋放記憶體的方式

c語言中的動態分配記憶體相關的函式是:malloc()和realloc(),釋放空間的函式是free()。 c++中動態分配記憶體相

關的函式是:new(),釋放空間的函式是delete(刪除單個

變數空間)和delete(釋放陣列空間)。

2、c和c++中動態分配和釋放記憶體的區別

(1) 相同點:都可用於申請動態記憶體和釋放記憶體。  

(2) 不同點:

a. 操作物件有所不同:

malloc 與 free 是 c++/c 語言的標準庫函式,new/delete 是 c++的運算子。對於非內部資料類的物件而言, 

malloc/free 無法滿足動態物件的要

求。物件在建立的同時要自動執行建構函式, 物件消亡之前要自動執行析構函式。由於 malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加 malloc/free。  

b. 在用法上也有所不同:

函式 malloc 的原型如下:

void * malloc(size_t size);
用 malloc 申請一塊長度為 length 的整數型別的記憶體,程式

如下: 

int *p = (int *) malloc(sizeof(int) * length);

我們應當把注意力集中在兩個要素上:「型別轉換」和「sizeof」。 malloc 返回值的型別是 void *,所以在呼叫 

malloc 時要顯式地進行型別轉換,將 void * 轉換成 所需要的指標型別。 malloc 函式本身並不識別要申請的記憶體是什麼型別,它只關心記憶體的總位元組數。

函式 free 的原型如下:

void free( void * memblock );
為什麼 free 函式不象 malloc 函式那樣複雜呢?這是因為指

針p的型別以及它所指的記憶體的容量事先都是知道

的,語句 free(p)能正確地釋放記憶體。如果 p 是 null 指標,那麼 free對 p 無論操作多少次都不會出問題。如果p

不是null 指標,那麼 free對p連續操作兩次就會導致程式執行錯誤。  

new/delete 的使用要點:運算子 new 使用起來要比函式 malloc 簡單得多,例如: 

int *p1 = (int *)malloc(sizeof(int) * length); 

int *p2 = new int[length];

這是因為new內建了sizeof、型別轉換和型別安全檢查功能。對於非內部資料型別的物件而言,new在建立動態

物件的同時完成了初始化工作。如果物件有多個建構函式,那麼 new 的語句也可以有多種形式。 如果用 new 建立物件陣列,那麼只能使用物件的無引數建構函式。 例如: 

obj *objects = new obj[100];

建立 100 個動態物件,不能寫成 obj *objects = new obj[100](1);// 建立 100 個動態物件的同時賦初值 1 ,在用 

delete 釋放物件陣列時,留意不要丟了符號『』。  

例如:

delete objects;   // 正確的用法   

delete objects; // 錯誤的用法 後者相當於 delete objects[0],漏掉了另外 99 個物件。

C和C 動態分配記憶體

1 基本語法 動態分配記憶體有兩種方式 malloc申請記憶體 free釋放記憶體 標頭檔案 include 用法示例 char p char malloc 84 含義 申請能存放84個char型別資料的空間,也就是說,開闢一塊84位元組的記憶體空間,p為指向這塊空間的指標。通用的方法為 objec...

C 動態分配後的記憶體釋放

最近在用c 寫專案時遇到的一些動態分配上的易錯點,所以寫這篇部落格來記錄下。下面我會列舉一些問題作為例子來總結一下動態分配的易錯點,如有不對,歡迎指正。我們經常會在乙個函式中對指標進行動態分配。動態分配伴隨著釋放,不及時釋放分配的記憶體會造成記憶體洩漏,那麼我們應該什麼時候在 釋放已經分配的記憶體呢...

C語言記憶體動態分配與釋放

c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫free ...