new/delete和malloc/free的區別(舉例說明)(簡單點)
阿新 • • 發佈:2019-01-30
先說說區別: 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只能成對使用,不能混了。