堆和堆檢查

程序中在棧中保存的數據會隨着函數的退出而被清理,只能用於保存局部變量。對於生存期大於局部變量的數據存儲通常保存在堆中,堆擁有遠比棧更多的可用空間。對於堆的分配和管理,內核使用堆管理器完成,對管理器相當於從系統的內存管理器中批發一塊大的內存,然後零售給應用程序使用。這樣就不需要頻繁的提交和釋放物理內存,也可以在程序中直接提交和管理內存,故windows系統主要提供三級內存分配體系靈活管理和使用內存


以c++語言的對空間申請爲例說明多級內存分配體系,應用程序中相當於new操作,實際上會調用crt中的malloc,而malloc去在win32平臺上調用的win32堆的分配函數HeapAlloc,但是對於釋放內存而言通常被優化爲直接使用jump指令直接跳轉到函數HeapFree函數去釋放內存,通常而言這部分內存並不會真的立即歸還給系統,而回在釋放超過4k,而空閒的內存大於64k的時候纔會對內存做一次取消提交的操作。

系統會在進程創建時同時也創建進程的默認堆,而在退出時會銷燬進程的默認堆。而堆管理器使用如下結構管理堆和堆塊:


HEAP和HEAP_SEGMENT結構起始處都有一個8字節的HEAP_ENTRY結構,HEAP結構內包含一個64元素的HEAP_SEGMENT數組,裏面記錄了各個HEAP_SEGMENT的信息,對於0號段,首先是一個HEAP結構,在這個之後是該段的HEAP_SEGMENT,其餘段則最開始便是HEAP_SEGMENT。





對管理器對於調試的支持:


相對於其他的調試支持都具有滯後性,不能立即找到溢出的地方,而頁堆在犧牲大量的性能和內存(爲每個對象加入柵欄頁)的情況下可以立即找到溢出的地方。


而通常情況下我們的編程語言採用CRT堆的方式分配和管理內存,並提供一定的調試支持:


_heap_alloc_base中進行以下動作:




故CRT堆內對調試提供的支持有:1.分配序號斷點。2.分配掛鉤。3.手動和自動檢查

windows系統還提供講堆塊內容輸出到文件或者轉儲文件的接口,以檢查堆狀態和內存泄漏的情況。


發佈了67 篇原創文章 · 獲贊 13 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章