淺談new/delete
阿新 • • 發佈:2018-12-22
在C語言的學習中,我用知道動態記憶體開闢是使用malloc函式來進行開闢一段連續的空間,釋放則是用free來進行釋放,而學習了C我們知道,在C中開闢記憶體是使用new,釋放則也與之對應的delete,下面我們就來說說malloc/free與new/delete之間的區別以及底層實現原理
回顧
在C語言庫中函式原型如下
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
malloc/free使用
int *p = (int*)malloc(sizeof(int)); //指向整型的指標p指向一個大小為100位元組的記憶體的地址 if(p == NULL) //使用之前一定要判斷釋放申請成功 { printf("application memory error"); } free(p); //釋放
與之還以兩個函式
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void *reallocarray(void *ptr, size_t nmemb, size_t size);
calloc 函式和malloc的區別就是申請好空間會初始化成0,另外calloc函式在使用時需要傳入元素個數和元素位元組大小
recalloc函式用於修改一個原先已經分配好的記憶體塊的大小,可以使一塊記憶體擴大或縮小,如果擴大記憶體,則原來的記憶體塊保持不變,在記憶體尾部增加新的記憶體塊,且不進行初始化。如果縮小記憶體,則原來記憶體塊從尾部進行刪減。如果原先的記憶體塊無法擴充,則新開闢一塊記憶體,並複製原先的記憶體的內容,原先記憶體塊失效無法再進行訪問。
new/delete使用
int *p = new int; //在自由儲存區中分配建立了一個整形物件,並返回一個指向該物件的地址來初始化指標p
int *p = new int(); //對指標p指向的地址的值進行了初始化為0
int *P = new int(1024);//初始化為1024
當動態建立的物件用完後必須釋放記憶體,避免造成記憶體洩漏,可以用delete來完成,new和delete是成對使用的,如下命令釋放p指向的int型物件所佔用的記憶體空間:
delete p
p = NULL;
C++中允許動態建立const物件
const int *p=new const int(1024); //動態建立的const物件必須進行初始化,並且進行初始化後的值不能再改變。
new[]/delete[]使用
當建立一個動態陣列物件和進行記憶體釋放時,執行以下語句:
int *p=new int[]; //指標p所指向的陣列未初始化
int *p=new int[n]; //指標p指向長度為n的陣列,未初始化
int *p=new int[](); //指標p所指向的地址初始化為0
delete [] p; //回收p所指向的陣列
它們之間的區別
new/delete原理
new[]/delete[]原理