2013-08-31 102 views
0

在計算機內存上,比如說IA32,一般堆棧的範圍是多少?我知道像0xffff1234這樣的地址可能在堆棧中。例如堆棧可能增長到0x0800abcd?堆怎麼樣?我知道堆地址總是低於堆棧地址,但通常它的範圍是什麼?還有堆下面的區域是什麼?堆棧和內存地址的範圍是什麼?

堆棧 - 程序使用實際運行程序內存。這包含局部變量,回撥數據(例如,當你調用一個函數,該堆棧存儲的狀態,並把你的代碼,你輸入的新功能之前),這種性質的一些其他的小東西。您通常不直接控制堆棧,變量和數據被破壞,當您移入和移出函數作用域時創建。

堆 - 該方案的「動態」存儲器。每次您動態創建一個新對象或變量時,它都會存儲在堆中。這個內存是由程序員直接控制的,你應該負責創建和刪除那裏的對象。

非常感謝!

回答

0

堆棧: 您可以在鏈接時定義堆棧的大小。 據我所知,Windows應用默認堆棧大小爲2MB。 您可以在項目設置中更改堆棧的大小。但是,當建立應用程序時,堆棧大小是固定的。 而OS會爲堆棧溢出設置警戒頁面。如果有任何操作嘗試訪問保護頁面將觸發EXCEPTION。

堆: 默認堆大小我也想在項目設置進行更改。 因爲在你的應用程序中,你可以創建自己的堆,或者使用CRT堆,Win32堆。所以應該有很多堆。 當你嘗試分配內存時,堆管理器根據算法分配內存。如果內存不足,堆管理器將從虛擬內存管理器申請內存。在用戶地址空間中沒有足夠的內存之前,拋出異常:內存不足。 有幾種定義:HeapNode,HeapSegment,LFH,LEA,BEA。 您可以使用Windbg:!堆-s,!堆-a,這些命令來檢查Windows堆的結構。