當我問你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都是以...