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

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,分别在不同的堆上申请,这样可以避免内存碎片。也方便管理。

HeapCreate的更多相关文章

  1. 创建堆 HeapCreate

    创建额外的堆的原因1.对组件进行保护2.更有效的内存管理3.局部访问4.避免线程同步开销5.快速释放 HeapCreate函数原型:HANDLE WINAPI HeapCreate( _In_ DWO ...

  2. HeapCreate深入研究

    本机:win7(x86),4G内存 #include"stdafx.h"#include<windows.h>#include<stdio.h>#inclu ...

  3. 算法与数据结构(十四) 堆排序 (Swift 3.0版)

    上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...

  4. C/C++内存分配

    一.      预备知识—程序的内存分配: 一个由C/C++编译的程序占用的内存分为以下几个部分:1.栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...

  5. C#封装好的Win32API

    Kernel.cs using System; using System.Runtime.InteropServices; using System.Text; using HANDLE = Syst ...

  6. malloc 函数工作机制(转)

    malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...

  7. Windows内存小结

    以前写过一篇理解程序内存, 当时主要是针对用户态,下面再稍微深入一点: 我们以32位程序为例(不启用AWE), 总共4G虚拟空间,其中低2G属于用户态, 高2G属于操作系统内核, 每个程序都有自己的低 ...

  8. 哈夫曼树(二)之 C++详解

    上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...

  9. Pooled Allocation(池式分配)实例——Keil 内存管理

    引言:说到动态申请(Dynamic Allocation)内存的好处,学过C/C++的人可能都有体会.运行时的灵活申请自然要比编码时的猜测好的多.而在内存受限情况下这种灵活性又有特别的好处--能让我们 ...

随机推荐

  1. 利用wrapper注冊的 java服务起动超时的解决方法

    使用Java Service Wrapper能够把java程序注冊为一个系统服务,可是在启动服务的某些情况下会抛出例如以下错误: ERROR  | wrapper  | 2014/06/11 08:4 ...

  2. 【zabbix】微信告警消息模版

    下面给出了一个zabbix微信告警消息的模版, 消息最后加上#号和短横线的设计有两个原因: 1,zabbix的微信告警消息总是被截断,比如最后一个告警时间,如果没有最后一行#号,在微信上看的时候时间不 ...

  3. springcloud 研发规范

    1) 程序结构规范 1: Facade-Stub:包含所有对外提供服务的借口定义,并对外提供 2:  Façade:实现Façade-Stub里面定义的全部借口,可以调用Service模块和Commo ...

  4. leetcode 859. Buddy Strings

    Given two strings A and B of lowercase letters, return true if and only if we can swap two letters i ...

  5. vue 动态传值笔记

    :prop="'answers.a' + item.split('.')[1]+'.total'" {{scope.row.answers['a'+item.split('.')[ ...

  6. Macaca,app-inspector安装

    1.安装brew 软件包管理工具:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst ...

  7. Spring Boot2.0之整合JSP

    首先不建议整合JSP哈,spring boot 对jsp的支持力度不大.  内置tomcat不支持jsp. 注意:在创建项目时候一定是war类型的,而不是跟之前那个freemarker那种jar类型. ...

  8. python的上下文管理器-1

    reference:https://zhuanlan.zhihu.com/p/26487659 来看看如何正确关闭一个文件. 普通版: def m1(): f = open("output. ...

  9. aoj 0033 玉

    図のように二股に分かれている容器があります.1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし.左の筒 B か右の筒 C に玉を入れます.板 D は支点 E を中心に左右 ...

  10. BZOJ1568:[JSOI2008]Blue Mary开公司

    浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227.html 题目传送门:https://www.lydsy.com/JudgeOnline/proble ...