相同點:它們都可以用來申請動態內存和是否內存。
不同點:1.malloc和free是C/C++語言的標準庫函數,new和delete是C++中的運算符。
2.對于非內部對象類型而言,malloc和free無法滿足要求,對象在創建的同時需要自動執行構造函數,在銷毀之前需要自動執行析構函數。由于
malloc和free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數強加給malloc和free。
3.函數malloc原型:
void* malloc(size_t size);
用malloc 申請一塊長度為length 的整數類型的內存,程序如下:int *p = (int *) malloc(sizeof(int) * length);
我們應當把注意力集中在兩個要素上:“類型轉換”和“sizeof”。
1. malloc 返回值的類型是void *,所以在調用malloc 時要顯式地進行類型轉換,將void * 轉換成所需要的指針類型。
2.malloc 函數本身并不識別要申請的內存是什么類型,它只關心內存的總字節數。
函數free 的原型如下:void free( void * memblock );
為什么free
函數不象malloc 函數那樣復雜呢?這是因為指針p 的類型以及它所指的內存的容量事先都是知道的,語句free(p)能正確地釋放內存。如果p
是NULL 指針,那么free對p 無論操作多少次都不會出問題。如果p 不是NULL 指針,那么free 對p連續操作兩次就會導致程序運行錯誤。
4.new/delete 的使用要點
運算符new 使用起來要比函數malloc 簡單得多,例如:
int *p1 = (int *)malloc(sizeof(int) * length);
int *p2 = new int[length];
這是因為new 內置了sizeof、類型轉換和類型安全檢查功能。對于非內部數據類型的對象而言,new 在創建動態對象的同時完成了初始化工作。如果對象有多個構造函數,那么new 的語句也可以有多種形式。