“堆”和“自由儲存區”
阿新 • • 發佈:2019-01-26
“C/C++中的記憶體分為幾個區?”
“通常分為5個區:堆、棧、自由儲存區、全域性/靜態儲存區、常量儲存區”。“堆和自由儲存區有什麼不同嗎?”
...
書上通常這麼說:malloc/free在堆上申請和釋放記憶體,new/delete在自由儲存區上申請和釋放記憶體。
堆(heap)C語言和作業系統的術語,堆是作業系統所維護的一塊特殊記憶體,它提供了動態分配的功能,當執行程式呼叫malloc()時就會從中分配,呼叫free()歸還記憶體。
自由儲存區(free store)是C++中通過new和delete動態分配和釋放物件的抽象概念,通過new來申請的記憶體區域可稱為自由儲存區,通過delete歸還記憶體。
基本上,所有的C++編譯器預設使用堆來實現自由儲存,運算子new和delete內部預設是使用malloc和free的方式來被實現,這時藉由new運算子分配的物件,說它在堆上也對,說它在自由儲存區上也正確。
說明:new和delete是運算子。
運算子可以過載,當new被程式設計師過載,且內部實現並非只有malloc()時,此時的記憶體空間就和堆不同了,這是一塊組合的記憶體空間,C++中稱為“自由儲存區”,這是一個抽象的概念。