普通情況下
兩者都是在堆上創建一段空間進行分配
看兩種分配的代碼:
int *a = new int;
delete a;
int *b = (int *)malloc(sizeof(int));
free(b);
可見兩者第一個大的區別new直接就是int型別的,而使用malloc是先將這段空間取出來,然后再轉化為int*型別,
- new分配記憶體按照資料型別進行分配,malloc分配記憶體按照指定的大小分配
- new回傳的是指定物件的指標,而malloc回傳的是void*,因此mallic的回傳值一般都需要進行型別轉化
- new回傳確切的資料型別,而
malloc()回傳void *, -
new如果分配失敗了會拋出bad_malloc的例外,而malloc失敗了會回傳NULL
此時可以看出malloc的大小即為后面的大小,那么用new應該怎樣分配隨意大小的記憶體呢?
int *a = new int[10];
int *b = (int *)malloc(sizeof(int)*10);
此時陣列a應該怎么洗掉呢?delete a;是普通的洗掉方法
此時應該用delete[] a;洗掉
- 申請陣列時,new[]一次分配所有記憶體,多次呼叫建構式,搭配使用delete[],delete[]多從呼叫解構式,銷毀陣列中的每個物件,而malloc則只能sizeof(int)*n,
類做物件時
上面講的是創建普通的物件和陣列的方法,看起來兩種方法并沒有什么大的區別,
下面我們看創建類的物件時,兩者的區別,
#include<iostream>
using namespace std;
class A{
public:
A(){
cout << "建構式" << endl;
}
~A(){
cout << "解構式" << endl;
}
};
void test(){
cout << "new的情況" << endl;
A *a = new A;
delete a;
cout << "malloc的情況" << endl;
A *b = (A*)malloc(sizeof(A));
free(b);
}
int main()
{
test();
system("pause");
return 0;
}

這個地方區別就出來了:
- 使用new/delete時,會呼叫類的建構式和解構式
- 而使用malloc時,并不會呼叫構造和析構
區別:
- new不僅會分配一段記憶體,而且會呼叫建構式,malloc不會,
- new分配的記憶體要用delete銷毀,malloc要用free來銷毀;delete銷毀的時候會呼叫物件的解構式,而free不會
new/delete和malloc/free可以混用嗎?
在普通情況下可以混用,
但是我們看到當創建類的物件時,如果使用new創建而使用free,那么此時僅僅呼叫了建構式,而沒有呼叫解構式,所以就會出錯
因此最好還是配套使用
- new創建需要用delete釋放
- malloc創建使用free釋放
- new int[] 創建需要用delete []釋放,
避免出錯,最好還是配套使用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/254440.html
標籤:其他
上一篇:二分與前綴和 學習筆記
