malloc和new的區別

2021-08-10 06:32:19 字數 3174 閱讀 3591

前段看書的時候看到了new和delete,是關於c++的動態記憶體開闢,而在以前的c語言的學習中學到過malloc和free,也是關於動態記憶體開闢的,今天想就c語言和c++ 中的動態記憶體有何差異來做個學習和總結。

在c語言中,動態記憶體的關鍵字有三個,分別是:

1.malloc其形式為

void* malloc(int size);

可以看到其返回值為void*,表示為未確定型別的指標,可以轉換為任意型別指標,只有乙個引數,就是開闢空間元素的大小,malloc不為開闢的空間進行初始化。在每個malloc後面都不能忘記使用free對開闢的空間進行釋放

2.calloc其形式為

void* calloc(n,int size);

返回值也是void*,n為申請空間的元素的個數,size為元素的大小,calloc會對申請的空間進行初始化,將其初始化為0。

3.realloc其形式為

void* realloc(void* p,int size);

返回值同樣是void*,作用是給乙個已經分配的位址的指標重新分配空間,p為原空間位址,size為重新申請的長度,realloc可以對給定的指標所指的空間進行擴大或者縮小,原有記憶體的中內容將保持不變.當然,對於縮小,縮小的那一部分的內容會丟失.

realloc並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址.realloc返回的指標很可能指向乙個新的位址.realloc是從堆上分配記憶體的.當擴大一塊記憶體空間時,realloc直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果滿足,就直接新增;

如果資料後面的位元組不夠,那麼就使用堆上第乙個有足夠大小的自由塊,現存的資料然後就被拷貝至新的位置,而老塊則放回到堆上.資料可能被移動.

new在定義變數時,必須指定資料型別和名字,但是動態建立物件時只需要指定其資料型別,不必命名

int i;

int *p = new

int;

int i(10);

int * p1 = new

int(10);

string s(10, '9');

string* ps = new

string(10, '9');

因為new 內建了sizeof、型別轉換和型別安全檢查功能。對於非內部資料型別的物件而言,new 在建立動態物件的同時完成了初始化工作

//如果提供了初值,new表示式分配記憶體後就用給定的初值初始化該記憶體空間,

int * p1 = new

int(10);

string* ps = new

string(10, '9');

//如果不提供顯示初始化,其初始化方式與函式的內定義初始化方式相同。類型別的物件,使用該類的預設建構函式初始化,內建型別物件無初始化。

string *ps = new

string;

int * pi = new

int;

//對於內建型別和沒有定義預設建構函式的型別,初始化方式有區別

int * p1 = new

int; //int型變數沒有初始化

int * p2 = new

int();//int型變數被初始化為0

delete

動態建立的物件用完之後,必須顯示的將物件所占用的記憶體返回給自由儲存區,在c++中我們使用delete來釋放指標所指向的空間。

int i;

int * pi = new

int;

delete pi;

delete表示式釋放指標指向的位址空間,如果指標指向的不是new分配的記憶體位址,則使用delete是不合法的。

執行完該語句後,p變成了不確定的指標,在很多機器上,儘管p值沒有明確定義,但仍然存放了它之前所指物件的位址,然後p所指向的記憶體已經被釋放了,所以p不再有效。此時,該指標變成了懸垂指標(懸垂指標指向曾經存放物件的記憶體,但該物件已經不存在了),一旦刪除了指標所指的物件,立即將指標置為0,這樣就非常清楚的指明指標不再指向任何物件。

//零值指標:

int *ip=0;

1.malloc/free是標準庫函式,而new/delete是運算子。

(1).為什麼有了malloc和free還要使用new和delete?

物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。因此c++需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。

(2).new和delete的功能已經覆蓋了malloc和free,那為什麼還要使用malloc和free呢?

因為c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。如果用free釋放「new建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。如果用delete釋放「malloc申請的動態記憶體」,理論上講程式不會出錯,但是該程式的可讀性很差。所以new/delete、malloc/free必須配對使用。

2.new返回指定型別的指標,並且可以自動計算所需要大小。而malloc則必須要由我們計算位元組數,並且在返回後強行轉換為實際型別的指標。

//new

int * p = new

int;

int * p1 = new

int [100];

//malloc

int * p = (int*)malloc(sizeof(int));

new和malloc的區別

1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...

malloc和new的區別

1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...

new 和 malloc 的區別

new 和 malloc 的區別 1.malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2.對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...