malloc和new的區別

1.  malloc 分配內存時不能自動計算內存大小,需要手動添加內存大小。

     new可以自動計算內存大小。

      示例:

        int* ptr = (int*) malloc(sizeof(int)*100);

        int* ptr = new int[100];

        同時,malloc返回一個空指針類型,要強制轉換成自己所需的類型;而 new返回一個指定的類型指針。


        在Linux中可以有這樣:malloc(0),這是因爲Linux中malloc有一個下限值16Bytes,注意malloc(-1)是禁止的;但是在某些系統中是不允許malloc(0)的。


2.     malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的 一片新內存中,其值將是隨機的。 

        new 會對分配的內存進行自動初始化。


        malloc函數的實質體現在,它有一個將可用的內存塊連接爲一個長長的列表的所謂空閒鏈表。調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然後,將該內存塊一分爲二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用戶的那塊內存傳給用戶,並將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閒鏈上。到最後,空閒鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那麼空閒鏈上可能沒有可以滿足用戶要求的片段了。於是,malloc函數請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各內存片段,對它們進行整理,將相鄰的小空閒塊合併成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數會返回NULL指針,因此在調用malloc動態申請內存塊時,一定要進行返回值的判斷。


Linux Libc6採用的機制是在free的時候試圖整合相鄰的碎片,使其合併成爲一個較大的free空間。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章