none
关于HeapCreate和HeapAlloc RRS feed

  • 问题

  • 你好:

          请问一下当我调用_crtheap1 = HeapCreate(0, 4096, 0);申请了4096的内存空间后,HeapAlloc(_crtheap1, 0, 10240);申请的空间超过了4096,但是也能够成功,是不是因为申请的空间可以自动增长?如果自动增长的话那增长的部分和原来的是否一定要连续?

    2021年10月3日 12:41

答案

  • 你好,

    感谢你在MSDN发帖。

    >>请问一下当我调用_crtheap1 = HeapCreate(0, 4096, 0);申请了4096的内存空间后,HeapAlloc(_crtheap1, 0, 10240);申请的空间超过了4096,但是也能够成功,是不是因为申请的空间可以自动增长?
        
    根据文档:HeapCreate 函数 (heapapi.h)

    dwMaximumSize:

    堆的最大大小,以字节为单位。该 HeapCreate功能回合dwMaximumSize到系统页面大小的倍数,然后保留在堆进程的虚拟地址空间大小的块。如果由作出分配请求 HeapAlloc或 HeapReAlloc的功能超过指定大小dwInitialSize,系统将提交对堆,直到堆的最大大小的内存其他页面。

    如果dwMaximumSize为 0,则堆的大小可以增长。堆的大小仅受可用内存的限制。分配大于固定大小堆限制的内存块的请求不会自动失败;相反,系统调用 VirtualAlloc函数来获取大块所需的内存。

    >>如果自动增长的话那增长的部分和原来的是否一定要连续?

    根据文档:根据文档:堆函数

    HeapCreate 请求的内存可能是连续的,也可能不是连续的。 HeapAlloc 在堆中分配 的内存是 连续的。 不应写入堆中的内存或读取堆中的内存,但 HeapAlloc 分配的内存除外,也不应假定 HeapAlloc 分配的两个内存区域之间有任何关系。

    Best Regards,

    Jeanine

    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年10月8日 9:15
    版主