windows系统-程序加载时生成栈和堆的过程
EXE文件的內容分為再配置信息、變量組和函數組,這一點想必大家都清楚了吧。不過,當程序加載到內存后,除此之外還會額外生成兩個組,那就是棧和堆。棧是用來存儲函數內部臨時使用的變量(局部變量【注1】),以及函數調用時所用的參數的內存區域。堆是用來存儲程序運行時的任意數據及對象的內存領域(圖)。
【注1】局部變量是指只在調用函數時存在于內存中的變量。例如,在代碼清單8-1中,WinMain函數的處理中的ave和buff都是局部變量。全局變量是指程序運行時一直存在于內存中的變量。代碼清單8-1中的title就是全局變量。
圖:加載到內存的程序由4部分構成
① 不管是什么程序,程序的內容都是由處理和數據構成的。大多數編程語言都是用函數來表示處理、用變量來表示數據。
EXE文件中并不存在棧及堆的組。棧和堆需要的內存空間是在EXE文件加載到內存后開始運行時得到分配的。因而,內存中的程序,就是由用于變量的內存空間、用于函數的內存空間、用于棧的內存空間、用于堆的內存空間這4部分構成的。當然,在內存中,加載Windows等操作系統的內存空間又是另外一回事了(圖)。
棧及堆的相似之處在于,他們的內存空間都是在程序運行時得到申請分配的【注2】。不過,在內存的使用方法上,二者存在些許不同。棧中對數據進行存儲和舍棄(清理處理)的代碼,是由編譯器自動生成的,因此不需要程序員的參與。使用棧的數據的內存空間,每當函數被調用時都會得到申請分配,并在函數處理完畢后自動釋放。與此相對,堆的內存空間,則要根據程序員編寫的程序,來明確進行申請分配或釋放。
【注2】棧和堆的大小,可以由程序員任意指定。在高級編程語言中,編譯器會自動生成指定棧和堆大小的代碼,并將其附加到程序中。
根據編程語言的不同,對堆用的內存空間進行申請分配和釋放的程序的編寫方法也是多種多樣的。C語言中是通過malloc()函數來進行申請分配、通過free()函數來釋放的。而C++中則是通過new運算符來申請分配、通過delete運算符來釋放的。無論是C語言還是C++,如果沒有在程序中明確釋放堆的內存空間,那么即使在處理完畢后,該內存空間仍會一直殘留。這個現象稱為內存泄露(memory leak),它是令C語言及C++的程序員們十分頭疼的一個bug(程序的錯誤)。如果內存泄露一直存在的話,就有可能會造成內存不足而導致宕機。這就好比,如果水龍頭一直嘀嗒嘀嗒地漏水,那么一晚上的時間水桶就可能會裝滿并溢出。
總結
以上是生活随笔為你收集整理的windows系统-程序加载时生成栈和堆的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows系统-函数的条件分支实现用
- 下一篇: 使用 Intellij Idea 打包