【问题标题】:What is the range of an address on stack and memory?堆栈和内存上的地址范围是多少?
【发布时间】:2013-08-31 03:31:46
【问题描述】:
在计算机内存上,比如 IA32,一般堆栈的范围是多少?我知道像 0xffff1234 这样的地址可能在堆栈上。例如,堆栈是否有可能增长到 0x0800abcd?堆呢?我知道堆地址总是低于堆栈地址,但通常它的范围是多少?还有堆下面的区域是什么?
堆栈 - 程序用于实际运行程序的内存。这包含局部变量、回调数据(例如,当您调用一个函数时,堆栈会存储您在进入新函数之前在代码中的状态和位置)以及其他一些类似性质的小东西。您通常不直接控制堆栈,变量和数据被销毁,在您移入和移出函数范围时创建。
堆 - 程序的“动态”内存。每次动态创建新对象或变量时,它都会存储在堆上。该内存由程序员直接控制,您应该负责那里的对象的创建和删除。
非常感谢!
【问题讨论】:
标签:
memory
heap-memory
stack-memory
【解决方案1】:
堆栈:
您可以在链接时定义堆栈的大小。
据我所知,Windows 应用程序默认堆栈大小为 2MB。
您可以在项目设置中更改堆栈的大小。但是在构建 App 时,堆栈大小是固定的。
操作系统会为堆栈溢出设置保护页面。如果任何操作尝试访问保护页面都会触发 EXCEPTION。
堆:
我猜默认堆大小也可以在项目设置中更改。
因为在你的App中,你可以创建自己的堆,或者使用CRT堆,Win32堆。所以应该有很多堆。
当你尝试分配内存时,堆管理器会根据算法来分配内存。如果没有足够的内存,堆管理器会向虚拟内存管理器申请内存。直到用户地址空间中没有足够的内存,抛出异常:内存不足。
有几个定义:HeapNode、HeapSegment、LFH、LEA、BEA。
并且可以使用Windbg:!heap -s, !heap -a,这些命令来检查Windows Heap的结构。