0

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

堆栈 - 程序用于实际运行程序的内存。这包含局部变量、回调数据(例如,当您调用一个函数时,堆栈会存储您在进入新函数之前在代码中的状态和位置)以及其他一些类似性质的小东西。您通常不直接控制堆栈,变量和数据被销毁,在您移入和移出函数范围时创建。

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

非常感谢!

4

1 回答 1

0

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

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

于 2013-09-04T10:15:26.573 回答