1. 程式人生 > >淺談new/delete

淺談new/delete

在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[]原理