1.因为它可以用来保存任何地址段
2.堆顶的地址是被操作系统保留的吧,那么VirtualAlloc的第一个参数,如果要指定某个数值的话,我怎么知道这个数值是不是在windows允许范围内的,同时不会破坏进程的栈空间和代码空间? 我觉得这个地址参数的风险很大呀。谢谢!

解决方案 »

  1.   

    VirtualAlloc第一个参数可以为NULL,由系统确定可分配的地址。你这个堆是不是指的堆栈哦?但是不管指的是哪个,都跟虚拟内存管理在不同的层次上,没什么可比性。
      

  2.   


    我确实不知道堆和栈一个在顶端一个在底端,头次听说,我很怀疑这种说法的正确性,按我的理解高地址空间肯定不是ring3程序可以访问的,所以顶端说法很欠准确,其次栈也不止1个,栈有很多,谁知道哪个是底端。还有,即便你理解它们不在同一个地方,是在虚拟内存的不同地址上,那也正好说明他们是基于虚拟地址的,不是吗?不正好也就说明虚拟内存管理是比它们更底层的一个层次?
      

  3.   

    VirtualAlloc不是在堆上分配,而是在进程可以访问的空闲地址空间分配的。
    堆最终也必然用VirtualAlloc分配的,分配完成后,你才需要考虑所谓的生长方向问题,但是那也是在VirtualAlloc分配好的内存内部进行的,VirtualAlloc怎么会破坏它
      

  4.   

    顶端/底端都是一块已经用VirtualAlloc分配好的内存的内部的问题,和VirtualAlloc已经没有关系了。VirtualAlloc面对的就是一块平板的没有方向的可用的内存