c++的記憶體管理與記憶體分配方式,實際上是兩個問題。
c++程式在編譯與執行過程中,實際上可能用到五種儲存區域。
棧(stack)。函式執行過程中建立的區域性變數都儲存在棧上。隨著函式或**塊的執行結束,這些區域性變數的空間也會被自動**。棧的優點是棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
堆(heap)。也成為動態儲存區。使用new,malloc操作可以動態地分配這部分記憶體。優點是動態儲存區的記憶體分配和**都由程式設計師決定,缺點是如果忘記**,可能造成記憶體洩漏,並且分配次數過多可能產生堆碎片。
全域性區或靜態區 --存放全域性變數和靜態變數;程式結束時由系統釋放,分為全域性初始化區和全域性未初始化區;
字元常量區 --常量字串放與此,程式結束時由系統釋放;
程式**區--存放函式體的二進位制**
為什麼這裡沒有提到自由儲存區?
因為自由儲存區和這裡提到的五種儲存區是兩個維度的概念,針對這個問題我們一點一點來分析。
自由儲存區和堆往往是容易混淆的地方。因為我們知道,c提供了malloc/free這對函式來提供動態記憶體的申請和釋放。而malloc函式申請的記憶體位置在堆上。c++在繼承了c語言的malloc/free的基礎上,還提供了new/delete這對保留字來提供更加便捷的動態記憶體申請與釋放。
malloc函式只分配空間,不呼叫任何建構函式,返回的是指向分配到的空間的void型的指標,如果失敗了就返回null指標。
而new不僅申請動態空間,同時會呼叫該型別變數的建構函式。如果分配成功會返回該型別的指標,失敗了會返回bad_alloc異常。
而這兩個函式申請的動態空間位置的定義,是最令人混淆的地方。malloc函式明確說明,分配的位置在堆上,這點沒有異議。而new分配的位置,按照bjarne stroustrup的說法,是在free store(自由儲存區)上。那麼,自由儲存區就是堆嗎?還是c++另外開闢的一塊記憶體空間?
實際上,c++的實際記憶體空間如上所述,只有這五種,而自由儲存區,是一種抽象的概念,而不是記憶體中的實際區域。可以這樣認為:自由儲存區就是new分配的區域。而自由儲存區的底層,具體的記憶體空間,還應當是上述五種空間之一。因為c++的預設new是使用malloc實現的,所以大多情況下,自由儲存區都建立在堆的基礎上。但是,如果對new進行過載,則可以使用其他區域實現自由儲存區。
而在分配記憶體時,有三種方式
從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。
在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。
動態記憶體的生存期由程式設計師決定,使用非常靈活,但如果在堆上分配了空間,就有責任**它。
C記憶體分配方式與C 記憶體分配方式
c記憶體分配方式 注 malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二 一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組 接下來,將分配...
C 記憶體分配方式
在c 中,記憶體分成5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。和堆一樣,使用者棧在程...
C 記憶體分配方式
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數名,區域性變數的名等。其操作方式類似於資料結構中的棧。2 堆區 heap 由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於...