自由儲存區VS堆

2021-09-12 07:58:13 字數 1139 閱讀 9532

當我問你c++的記憶體布局時,你大概會回答:

「在c++中,記憶體區分為5個區,分別是堆、棧、自由儲存區、全域性/靜態儲存區、常量儲存區」。

如果我接著問你自由儲存區與堆有什麼區別,你或許這樣回答:

「malloc在堆上分配的記憶體塊,使用free釋放記憶體,而new所申請的記憶體則是在自由儲存區上,使用delete來釋放。」

這樣聽起來似乎也沒錯,但如果我接著問:

自由儲存區與堆是兩塊不同的記憶體區域嗎?它們有可能相同嗎?

你可能就懵了。

事實上,我在網上看的很多部落格,劃分自由儲存區與堆的分界線就是new/delete與malloc/free。然而,儘管c++標準沒有要求,但很多編譯器的new/delete都是以malloc/free為基礎來實現的。那麼請問:藉以malloc實現的new,所申請的記憶體是在堆上還是在自由儲存區上?

從技術上來說,堆(heap)是c語言和作業系統的術語。堆是作業系統所維護的一塊特殊記憶體,它提供了動態分配的功能,當執行程式呼叫malloc()時就會從中分配,稍後呼叫free可把記憶體交還。而自由儲存是c++中通過new和delete動態分配和釋放物件的抽象概念,通過new來申請的記憶體區域可稱為自由儲存區。基本上,所有的c++編譯器預設使用堆來實現自由儲存,也即是預設的全域性運算子new和delete也許會按照malloc和free的方式來被實現,這時藉由new運算子分配的物件,說它在堆上也對,說它在自由儲存區上也正確。但程式設計師也可以通過過載操作符,改用其他記憶體來實現自由儲存,例如全域性變數做的物件池,這時自由儲存區就區別於堆了。我們所需要記住的就是:

堆是作業系統維護的一塊記憶體,而自由儲存是c++中通過new與delete動態分配和釋放物件的抽象概念。堆與自由儲存區並不等價。

結論

自由儲存是c++中通過new與delete動態分配和釋放物件的抽象概念,而堆(heap)是c語言和作業系統的術語,是作業系統維護的一塊動態分配記憶體。

new所申請的記憶體區域在c++中稱為自由儲存區。藉由堆實現的自由儲存,可以說new所申請的記憶體區域在堆上。

堆與自由儲存區還是有區別的,它們並非等價。

假如你來自c語言,從沒接觸過c++;或者說你一開始就熟悉c++的自由儲存概念,而從沒聽說過c語言的malloc,可能你就不會陷入「自由儲存區與堆好像一樣,好像又不同」這樣的迷惑之中

自由儲存區和堆

當我問你c 的記憶體布局時,你大概會回答 在c 中,記憶體區分為5個區,分別是堆 棧 自由儲存區 全域性 靜態儲存區 常量儲存區 如果我接著問你自由儲存區與堆有什麼區別,你或許這樣回答 malloc在堆上分配的記憶體塊,使用free釋放記憶體,而new所申請的記憶體則是在自由儲存區上,使用delet...

「堆」和「自由儲存區」

c c 中的記憶體分為幾個區?通常分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區 常量儲存區 堆和自由儲存區有什麼不同嗎?書上通常這麼說 malloc free在堆上申請和釋放記憶體,new delete在自由儲存區上申請和釋放記憶體。堆 heap c語言和作業系統的術語,堆是作業系統所維護的一...

自由儲存區和堆

自由儲存區和堆的區別是乙個老生常談的問題了,就像面試題new和malloc的區別一樣。事實上,網上多說人認為,自由儲存區與堆的劃分標準是申請和釋放記憶體是使用的new delete還是malloc free。c 標準並沒有給出new delete應該如何實現,但很多編譯器的new delete都是以...