new與malloc的區別

2021-08-19 20:19:14 字數 1484 閱讀 7975

1.屬性區別

new與delete是c++中的關鍵字,而malloc與free作為函式使用,需要新增標頭檔案

2.引數

使用new申請記憶體無需制定記憶體大小,由系統自動分配,malloc需要顯示給出引數

3.返回型別

new申請後返回的是指向物件型別的指標,型別嚴格與分配型別匹配,型別安全,不需要進行型別強轉,而malloc申請成功後返回的是void*,需要通過型別強制準換成我們需要的型別

4.申請失敗

當new申請失敗時,返回的是bac_alloc,而void申請失敗時返回的是null

5.自定義型別

new會先呼叫operator new函式,申請足夠的記憶體(通常底層使用malloc實現)。然後呼叫型別的建構函式,初始化成員變數,最後返回自定義型別指標。delete先呼叫析構函式,然後呼叫operator delete函式釋放記憶體(通常底層使用free實現)。

malloc/free是庫函式,只能動態的申請和釋放記憶體,無法強制要求其做自定義型別物件構造和析構工作。new可簡單的認為是malloc加型別的構造與析構函式組成。

6.過載

c++允許過載new/delete操作符,特別的,布局new的就不需要為物件分配記憶體,而是指定了乙個位址作為記憶體起始區域,new在這段記憶體上為物件呼叫建構函式完成初始化工作,並返回此位址。而malloc不允許過載。

malloc()到底從**得到了記憶體空間?

答案是從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。

作業系統中有乙個記錄空閒記憶體位址的鍊錶。當作業系統收到程式的申請時,就會遍歷該鍊錶,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。

malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶(free list)。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊(根據不同的演算法而定(將最先找到的不小於申請的大小記憶體塊分配給請求者,將最合適申請大小的空閒記憶體分配給請求者,或者是分配最大的空閒塊記憶體塊)。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。

呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。

在此也要說明就是因為new和malloc需要符合大眾的申請記憶體空間的要求,針對泛型提供的,分配記憶體設計到分配演算法和查詢,此外還要避免記憶體碎片,所以其效率比較低下,因此有時程式猿會自己重寫new和delete,或者建立乙個記憶體池來管理記憶體,提高程式執行的效率。

new與malloc的區別

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

new與malloc的區別

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

Malloc與new 的區別

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