日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++内存管理与分配方式

發布時間:2025/4/16 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++内存管理与分配方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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釋放內存。
    動態內存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它。
  • 轉載于:https://www.cnblogs.com/mockingbirdbad/p/10582009.html

    總結

    以上是生活随笔為你收集整理的C++内存管理与分配方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。