C和C++中動態分配和釋放內存的方式及其區別
1、C和C++中動態分配和釋放內存的方式
關的函數是:new(),釋放空間的函數是delete(刪除單個變量空間)和delete[](釋放數組空間)。C語言中的動態分配內存相關的函數是:malloc()和realloc(),釋放空間的函數是free()。 C++中動態分配內存相
2、C和C++中動態分配和釋放內存的區別
(1) 相同點:都可用於申請動態內存和釋放內存。
(2) 不同點:
malloc/free 無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數, 對象消亡之前要自動執行析構函數。由於 malloc/free 是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加 malloc/free。a. 操作對象有所不同:
malloc 與 free 是 C++/C 語言的標準庫函數,new/delete 是 C++的運算符。對於非內部數據類的對象而言,
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];
delete 釋放對象數組時,留意不要丟了符號‘[]’。創建 100 個動態對象,不能寫成 Obj *objects = new Obj[100](1);// 創建 100 個動態對象的同時賦初值 1 ,在用
例如:
delete []objects; // 正確的用法 delete objects; // 錯誤的用法 後者相當於 delete objects[0],漏掉了另外 99 個對象。
Tags: 編譯器 註意力 C語言 動態 程序
文章來源: