c和c++中動態分配和釋放記憶體的方式及其區別
1、c和c++中動態分配和釋放記憶體的方式
c語言中的動態分配記憶體相關的函式是:malloc()和realloc(),釋放空間的函式是free()。 c++中動態分配記憶體相關的函式是:new(),釋放空間的函式是delete(刪除單個
變數空間)和delete(釋放陣列空間)。
2、c和c++中動態分配和釋放記憶體的區別
(1) 相同點:都可用於申請動態記憶體和釋放記憶體。
(2) 不同點:
a. 操作物件有所不同:malloc/free 無法滿足動態物件的要malloc 與 free 是 c++/c 語言的標準庫函式,new/delete 是 c++的運算子。對於非內部資料類的物件而言,
求。物件在建立的同時要自動執行建構函式, 物件消亡之前要自動執行析構函式。由於 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 ...