堆栈和内存上的地址范围是多少?

时间:2013-08-31 03:31:46

标签: memory stack heap

在计算机内存上,比如说IA32,一般来说堆栈的范围是多少?我知道像0xffff1234这样的地址可能在堆栈上。例如,堆栈有可能增长到0x0800abcd吗?堆怎么样?我知道堆地址总是低于堆栈地址,但通常它的范围是多少?堆下面的区域是什么?

堆栈 - 程序用于实际运行程序的内存。它包含局部变量,回调数据(例如,当您调用函数时,堆栈会在您输入新函数之前存储您在代码中的状态和位置),以及其他一些具有这种性质的小事情。您通常不直接控制堆栈,在进出功能范围时会破坏变量和数据。

堆 - 程序的“动态”内存。每次动态创建新对象或变量时,它都存储在堆上。这个内存由程序员直接控制,你应该在那里处理对象的创建和删除。

非常感谢!

1 个答案:

答案 0 :(得分:0)

堆栈: 您可以在链接时间中定义堆栈的大小。 据我所知,Windows应用程序默认堆栈大小为2MB。 您可以在项目设置中更改堆栈的大小。但是当构建App时,堆栈大小是固定的。 OS会为堆栈溢出设置保护页面。如果任何操作尝试访问保护页面将触发EXCEPTION。

堆: 我猜也可以在项目设置中更改默认堆大小。 因为在您的应用程序中,您可以创建自己的堆,或使用CRT堆,Win32堆。所以应该有很多堆。 当你尝试分配内存时,Heap Manager基于算法来分配内存。如果内存不足,堆管理器将从虚拟内存管理器申请内存。在用户地址空间中没有足够的内存之前,抛出异常:内存不足。 有几个定义:HeapNode,HeapSegment,LFH,LEA,BEA。 你可以使用Windbg:!heap -s,!heap -a,这些命令来检查Windows堆的结构。

相关问题