C內存分配方式與C++內存分配方式

C內存分配方式:

  • 棧區(stack)—由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
  • 堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表
  • 全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。  程序結束後由系統釋放。
  • 常量區—常量字符串就是放在這裏的,直到程序結束後由系統釋放。
  • 代碼區—存放函數體的二進制代碼。


注:malloc函數的實質體現在,它有一個將可用的內存塊連接爲一個長長的列表的所謂空閒鏈表。調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然後,將該內存塊一分爲二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用戶的那塊內存傳給用戶,並將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閒鏈上。到最後,空閒鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那麼空閒鏈上可能沒有可以滿足用戶要求的片段了。於是,malloc函數請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各內存片段,對它們進行整理,將相鄰的小空閒塊合併成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數會返回NULL指針,因此在調用malloc動態申請內存塊時,一定要進行返回值的判斷。



C++內存分配方式:

  • 棧區(stack)—就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變量的存儲區。裏面的變量通常是局部變量、函數參數等。在一個進程中,位於用戶虛擬地址空間頂部的是用戶棧,編譯器用它來實現函數的調用
  • 堆區(heap)—就是那些由 new 分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個 new 就要對應一個 delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。堆可以動態地擴展和收縮。
  • 全局區存儲區(靜態區)(static)—這是一塊比較特殊的存儲區,他們裏面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)
  • 自由存儲區 — 就是那些由 malloc 等分配的內存塊,他和堆是十分相似的,不過它是用 free 來結束自己的生命的


相關鏈接:

C++:http://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html

C:http://www.cnblogs.com/coder2012/p/3150757.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章