一個由C/C++編譯的程序占用的內(nèi)存分為以下幾個部分:
1或渤、棧區(qū)(stack)— 由編譯器自動分配釋放 系冗,存放為運行函數(shù)而分配的局部變量、函數(shù)參數(shù)薪鹦、返回數(shù)據(jù)掌敬、返回地址等。
其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧池磁。(內(nèi)存分配時奔害,與堆相向而生,因此申請內(nèi)存是有限的地熄,運用不當(dāng)华临,會出現(xiàn)棧溢出)
2、堆區(qū)(heap) — 一般由程序員分配釋放端考, 若程序員不釋放雅潭,程序結(jié)束時可能由OS回收 揭厚。分配方式類似于鏈表。
3扶供、全局區(qū)(靜態(tài)區(qū))(static)—存放全局變量筛圆、靜態(tài)數(shù)據(jù)、常量椿浓。程序結(jié)束后由系統(tǒng)釋放太援。4、文字常量區(qū) —常量字符串就是放在這里的扳碍。 程序結(jié)束后由系統(tǒng)釋放提岔。
5、程序代碼區(qū)—存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進制代碼左腔。
內(nèi)存分配有以下三種方式:
1.從靜態(tài)存儲區(qū)域分配
內(nèi)存在程序編譯的時候就已經(jīng)分配好唧垦,這塊內(nèi)存在程序的整個運行期間都存在。例如全局變量液样,static變量振亮。
2.在棧上創(chuàng)建(地址從大到小)
在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建鞭莽,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放坊秸。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高澎怒,但是分配的內(nèi)存容量有限褒搔。(棧上的變量都具有臨時變量的特性)
3.從堆上分配(地址從小到大)
亦稱動態(tài)內(nèi)存分配。程序在運行的時候用malloc或new申請任意多少的內(nèi)存喷面,程序員自己負責(zé)在何時用free或delete釋放內(nèi)存星瘾。
動態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活惧辈,但如果在堆上分配了空間琳状,就有責(zé)任回收它,否則運行的程序會出現(xiàn)內(nèi)存泄漏盒齿,
頻繁地分配和釋放不同大小的堆空間將會產(chǎn)生堆內(nèi)存碎塊念逞。(在程序關(guān)閉(運行結(jié)束)后,內(nèi)存泄漏消失)
小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙六六六二九五四九八 邀請編碼【凌云】無論你是大牛還是小白边翁,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)翎承!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享符匾!