C和C++中動態分配和釋放內存的方式及其區別

分類:編程 時間:2016-11-07
[摘要:C戰C++中靜態分派戰開釋內存的體式格局及其差別 1、C戰C++中靜態分派戰開釋內存的體式格局 C說話中的靜態分派內存相幹的函數是:malloc()戰realloc(),開釋空間的函數]

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 個對象。  



Tags: 編譯器 註意力 C語言 動態 程序

文章來源:


ads
ads

相關文章
ads

相關文章

ad