堆區(heap):一般由程式設計師自動分配,如果程式設計師沒有釋放,程式結束時可能有os**。其分配類似於鍊錶。
全域性區(靜態區static):存放全域性變數、靜態資料、常量。程式結束後由系統釋放。全域性區分為已初始化全域性區(data)和未初始化全域性區(bss)。
常量區(文字常量區):存放常量字串,程式結束後有系統釋放。、
**區:存放函式體(類成員函式和全域性區)的二進位制**。
內存在程式編譯的時候已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。
在執行函式時,函式內區域性變數的儲存單元可以在棧上建立,函式執行結束時,這些記憶體單元會自動被釋放。 棧記憶體分配運算內置於處理器的指令集,效率高,但是分配的記憶體容量有限。
亦稱為動態記憶體分配。
程式在執行的時候使用malloc或者new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。 動態記憶體的生命週期有程式設計師決定,使用非常靈活,但如果在堆上分配了空間,既有責任**它,否則執行的程式會出現記憶體洩漏,頻繁的分配和釋放不同大小的堆空間將會產生記憶體碎片。
(1)靜態全域性變數和全域性變數都屬於常量區
(2)靜態全域性區只在本檔案中有效,別的檔案想呼叫該變數,是調不了的,而全域性變數在別的檔案中可以呼叫
(3)如果別的檔案中定義了乙個該全域性變數相同的變數名,是會出錯的。
(1)靜態區域性變數是屬於常量區的,而函式內部的區域性變數屬於棧區;
(2)靜態區域性變數在該函式呼叫結束時,不會銷毀,而是隨整個程式結束而結束,但是別的函式呼叫不了該變數,區域性變數隨該函式的結束而結束;
(3)如果定義這兩個變數的時候沒有初始值時,靜態區域性變數會自動定義為0,而區域性變數就是乙個隨機值;
(4)靜態區域性變數在編譯期間只賦值一次,以後每次函式呼叫時,不再賦值,呼叫上次的函式呼叫結束時的值。區域性變數在呼叫期間,每呼叫一次,賦一次值。
陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。
指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。
(1)指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。
(2)指標p被free或者delete之後,沒有置為null。
(3)指標操作超越了變數的作用域範圍。
malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。
對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。
因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。
C 記憶體管理 C 記憶體分類
c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...
C 記憶體管理
在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...
c 記憶體管理
這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...