首页 > 代码库 > HeapCreate

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,讲的比较清楚
http://msdn.microsoft.com/en-us/library/aa366599(VS.85).aspx
 
不过要注意以下几点:
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,分别在不同的堆上申请,这样可以避免内存碎片。也方便管理。

HeapCreate