堆栈和内存上的地址范围是什么?
在计算机内存上,比如说IA32,一般堆栈的范围是什么? 我知道像0xffff1234这样的地址可能在堆栈中。 例如堆栈可能增长到0x0800abcd? 堆怎么样? 我知道堆地址总是低于堆栈地址,但通常它的范围是什么? 还有堆下面的区域是什么?
堆栈 - 程序用于实际运行程序的内存。 这包含局部变量,回调数据(例如,当您调用函数,堆栈存储状态并在输入新函数之前将其置于代码中)以及其他一些小事情。 您通常不直接控制堆栈,变量和数据被破坏,当您移入和移出函数作用域时创建。
堆 - 程序的“动态”内存。 每次您动态创建一个新对象或变量时,它都会存储在堆中。 这个内存是由程序员直接控制的,你应该负责创建和删除那里的对象。
非常感谢!
堆栈:您可以在链接时间内定义堆栈的大小。 据我所知,Windows应用默认堆栈大小为2MB。 您可以在项目设置中更改堆栈的大小。 但是,当建立应用程序时,堆栈大小是固定的。 OS会为堆栈溢出设置警戒页面。 如果有任何操作尝试访问保护页面将触发EXCEPTION。
堆:我猜也可以在项目设置中更改默认堆大小。 因为在你的App中,你可以创建自己的堆,或者使用CRT堆,Win32堆。 所以应该有很多堆。 当你尝试分配内存时,堆管理器会根据算法来分配内存。 如果内存不足,堆管理器将从虚拟内存管理器申请内存。 在用户地址空间中没有足够的内存之前,抛出异常:内存不足。 有几个定义:HeapNode,HeapSegment,LFH,LEA,BEA。 你可以使用Windbg:!heap -s,!heap -a,这些命令来检查Windows Heap的结构。
链接地址: http://www.djcxy.com/p/79835.html