2013-08-31 70 views
0

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

堆栈 - 程序使用实际运行程序内存。这包含局部变量,回拨数据(例如,当你调用一个函数,该堆栈存储的状态,并把你的代码,你输入的新功能之前),这种性质的一些其他的小东西。您通常不直接控制堆栈,变量和数据被破坏,当您移入和移出函数作用域时创建。

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

非常感谢!

回答

0

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

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