• 关于HeapCreate(1)


    这个最好看MSDN,讲的比较清楚
     
    不过要注意以下几点:
    1 申请的私有内存只能被调用进程(就是call这个api的进程)使用
    2 HANDLE WINAPI HeapCreate(
      __in  DWORD flOptions,
      __in  SIZE_T dwInitialSize,
      __in  SIZE_T dwMaximumSize
    );
    第三个参数的设置,如果指定为0的话,则堆可以在需要的情况下不断增大。Applications that need to allocate large memory blocks should set dwMaximumSize to 0.(from MSDN)
    3 如果有动态库的加载,则该库创建的堆会在该进程的地址空间中。(If a dynamic-link library (DLL) creates a private heap, the heap is created in the address space of the process that calls the DLL, and it is accessible only to that process.)。比如malloc等运行时api,在msvcrt库中,这个库就会创建私有堆(在调用进程中)
     
    ==============================================================
     
    (以下from CSDN)
    heapcreate
    heapalloc
    这丙个函数分别是什么意思,如何用的

    我原以为heapalloc,就跟new一样的,直接给出堆开始地址,大小就可以了

    但我看到别人的程序中,都是用heapcreate创建一个堆
    然后就在这个堆上不停的heapalloc?不理解怎么在一个堆上,不停申请空间

    如果说堆的开始地址是一样的话,那么多次调用heapalloc,是系统自己在堆上,连续开辟空间

    而不需要人为每次指定不同的堆开始地址?
    ===============================================
    默认系统为每一个进程都分配一个Heap,可以使用GetProcessHeap取得,其句柄。但是这个堆,是不允许程序自己释放,也就是不允许Destroy。
    在某些应用场合,可能会在某一个时间段内,或者某一个任务内需要大量的内存,并且可能是一个个很小很小的分片。如果全都使用默认的堆,那么全用完之后,需要释放就显得相当麻烦,必须一个个的释放,而如果这个作业中途异常,可能导致一些内存分片的句柄丢失,则释放就更加麻烦,又不能枚举出来一个个释放 ,如此就很容易造成内存丢失,但是在这种情况下,就可以通过HeapCreate创建一个独立的内存堆,当应用完之后,直接HeapDestroy将该内存堆所有内存释放掉。
  • 相关阅读:
    java面试常见的类
    Day6
    DAY5
    Day4
    Day3
    Day2
    Day1
    echarts3关系图:力引导布局, 固定某些节点
    Hbuilder中配置cmd
    webpack 学习
  • 原文地址:https://www.cnblogs.com/lancidie/p/1952356.html
Copyright © 2020-2023  润新知