1. 程式人生 > >new/delete和malloc/free的區別(舉例說明)(簡單點)

new/delete和malloc/free的區別(舉例說明)(簡單點)

先說說區別: 
1. new/delete是C++裡才有的。 
2. new/delete通常來說是操作符,就是"+","-"一樣。 
3. new/delete是可以過載的,而過載之後,就成為了函式。 
4. malloc在申請記憶體的時候,必須要提供申請的長度,而且返回的指標是void*型,必須要強轉成需要的型別。 
5. 當new/delete在類中被過載的時候,可以自定義申請過程,比如記錄所申請記憶體的總長度,以及跟蹤每個物件的指標。 
6. new/delete,其實內部也呼叫了malloc/free。
共同點: 
1. 都必須配對使用。 
2. 都是申請記憶體,釋放記憶體。 
3. free和delete可以釋放NULL指標。
注意點:
new/delete與malloc/free不能混合使用。

舉幾個簡單的例子吧:
int* pn = (int*)malloc(sizeof(int));
*pn = 15;
free(pn);
pn = NULL; // 置空
free(pn); // OK,沒有問題
double* pd = new double;
*pd = 212.211;
delete = pd;
short* ps = new short[128]; // new出一個數組來
ps[1] = 1231;
ps[11] = 1111;
delete[] ps;  // 請注意delete的語法。

// 以下是一個過載new操作符的例子,一般來說是不會用到的,除非要設計一個編譯器之類的東西。
class Sample
{
public:
    static CSample* operator= new()
    {
        CSample* p = (CSample*)malloc(size(Sample));
        return p;
    }
}

好 我簡單的說下,樓上說的很多了,我也發表一點愚見

1 我認為new\delete和malloc\free最大區別是對物件的理解。
如果你使用
Foo* foo = malloc(sizeof(Foo));//Foo是一個類
初始化,那麼你將不會呼叫Foo的構造方法,而只是單純的分配空間。而且我們只認為你是分配一個空間,而不是想建立一個物件。
Foo* foo = new Foo();則會呼叫Foo的構造方法來初始化物件,也就是說你既要分配空間又要初始化這段空間,讓它變成一個物件。
對於delete和free也有同樣的問題,就是delete會呼叫解構函式,free則不會。
說白了,new\delete玩的是物件,而malloc\free僅僅是記憶體空間而已

2 對於除去物件意外的其他情況,比如int和float等
int* Array=new int[10];和int* Array=malloc(sizeof(int)*10);只存在使用技巧的差別,沒有本質的差別。

3 最後也提醒你new\delete和malloc\free只能成對使用,不能混了。