• HeapCreate


    为进程创建新堆,请求分配虚拟内存分页,函数原型如下:

    HANDLE HeapCreate(

        DWORD flOptions,

        SIZE_T dwInitialSize,

        SIZE_T dwMaximumSize);

        参数:
        flOptions:输入参数,创建堆的选项,其值如下:

    HEAP_CREATE_ENABLE_EXECUTE: 分配的内存允许用于代码执行

    HEAP_GENERATE_EXCEPTIONS: 如果分析内存失败会产生异常,而不是返回NULL

    HEAP_NO_SERALIZE: 不进行连续存取

        dwInitialSize: 输入参数,堆的初始化大小(以字节为单位)如果指定的大小没有内存页对齐(值为内存页大小的整数倍),系统会自动进行内存页对齐。如果为0,系统会自动指定为一个内存页的大小。

        dwmaximumSize:输入参数,堆大小的最大值,如果指定了,则此分配的内存块的大小不能大于此值。如果为0,那么此堆是增长的,也就是其上分配的大小不受限制,可以达到系统中所能获得的最大内存。

        返回值:

        返回为HANDLE类型,如果失败,返回NULL,如果成功,返回所创建的句柄

    分配内存函数
      LocalAlloc:速度比其他内存管理函数慢,功能不多,推荐使用HeapAlloc
    HeapAlloc:缺点是内存块小,不能超过4MB,推荐使用VirtualAlloc
    VirtualAlloc:内存块可以超过4MB
    个最好看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,是系统自己在堆上,连续开辟空间

    而不需要人为每次指定不同的堆开始地址?
    ===============================================
    默认系统为每一个进程都分配一个Heap,可以使用GetProcessHeap取得,其句柄。但是这个堆,是不允许程序自己释放,也就是不允许Destroy。
    在 某些应用场合,可能会在某一个时间段内,或者某一个任务内需要大量的内存,并且可能是一个个很小很小的分片。如果全都使用默认的堆,那么全用完之后,需要 释放就显得相当麻烦,必须一个个的释放,而如果这个作业中途异常,可能导致一些内存分片的句柄丢失,则释放就更加麻烦,又不能枚举出来一个个释放 ,如此就很容易造成内存丢失,但是在这种情况下,就可以通过HeapCreate创建一个独立的内存堆,当应用完之后,直接HeapDestroy将该内存堆所有内存释放掉。
    你可以在一个堆上申请内存,最后用HeapDestroy一次性回收内存。
    The HeapDestroy function destroys the specified heap object. HeapDestroy decommits and releases all the pages of a private heap object, and it invalidates the handle to the heap.

    你不可能在系统堆上申请内存,只能说是进程的默认的堆,拥有自己的私有的堆实质是为了方便管理内存。

    假设说:我的程序只要分配1.5KB和3.2KB两种内存,如果我分别建立两个heap,分别在不同的堆上申请,这样可以避免内存碎片。也方便管理。
  • 相关阅读:
    [WP8.1UI控件编程]SemanticZoom控件实现分组列表
    [深入浅出WP8.1(Runtime)]Toast通知
    [深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件
    [深入浅出WP8.1(Runtime)]应用文件的URI方案
    [深入浅出WP8.1(Runtime)]浮出控件(Flyout)
    [深入浅出WP8.1(Runtime)]文本框(TextBox)
    [深入浅出WP8.1(Runtime)]文本块(TextBlock)
    [深入浅出WP8.1(Runtime)]Windows Phone 8.1和Silverlight 8.1的区别
    [WP8.1UI控件编程]Windows Phone XAML页面的编译
    [WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/4095918.html
Copyright © 2020-2023  润新知