自由儲存區和堆

2021-08-09 10:23:31 字數 776 閱讀 2530

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

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

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

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

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

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

自由儲存區與堆的劃分標準是申請和釋放記憶體是使用的new/delete還是malloc/free。c++標準並沒有給出new/delete應該如何實現,但很多編譯器的new/delete都是以malloc/free為基礎來實現的。   

從技術上來說,堆(heap)是c語言和作業系統的術語,堆是作業系統所維護的一塊特殊記憶體,它提供了動態分配的功能,使用malloc()、free()來申請/釋放記憶體。  

而自由儲存是c++中通過new和delete動態分配和釋放物件的抽象概念。基本上,所有的c++編譯器預設使用堆來實現自由儲存。也就是說,預設的全域性運算子new和delete也許會使用malloc和free的方式申請和釋放儲存空間,也就是說自由儲存區就位於堆上。  

但程式設計師也可以通過過載操作符,改用其他記憶體來實現自由儲存,例如全域性變數做的物件池,這時自由儲存區就不位於堆上了。

【原文】c++ 自由儲存區是否等價於堆?

「堆」和「自由儲存區」

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

自由儲存區和堆

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

自由儲存區VS堆

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