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

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. .Net反射机制

    现在谈.Net反射机制本不在计划中,因为本打算研究完设计模式后再去学习别的技术:但迫于设计模式系列一创建型之(抽象工厂模式)一章中遗留问题,才不得已在设计模式之游中插入本篇文章!签于本人对反射理解也不 ...

  2. sqlldr 用法

    转自:http://blog.chinaunix.net/uid-23622436-id-2394093.html 在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几 ...

  3. 基于 HTTP 协议的几种实时数据获取技术(转)

    HTTP协议 HTTP协议大家都很熟悉了,开始本文之前,首先简单回顾一下HTTP协议. HTTP协议是建立在TCP协议上的应用层协议,协议的本质是请求----应答: 即对于HTTP协议来说,服务端给一 ...

  4. 流畅python学习笔记:第十六章:协程

    通常在python进行编程一般都是使用多线程或者多进程来实现.这里介绍另外一种并发的方式,就是协程,但和多线程以及多进程不一样的是,协程是运行在单线程当中的并发.来看下具体的例子: def simpl ...

  5. 【Leetcode-easy】String to Integer(atoi)

    题目要求:字符串->整型 * 1. 首先需要丢弃字符串前面的空格. * 2. 然后可能有正负号(注意只取一个,如果有多个正负号,那么说这个字符串是无法转换的,返回0.比如测试用例里就有个“+-2 ...

  6. MySQL 中事务的实现

    在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的: 在这篇文章中,我们将对事务的实现进行分析, ...

  7. mvc Bundling 学习记录(一)

    参考博客:http://www.cnblogs.com/xwgli/p/3296809.html 这里要详细记录的是对于现有MVC项目进行Bundling功能 1  如果没有System.Web.Op ...

  8. IC卡、ID卡、M1卡、射频卡的区别是什么【转】

    本文转载自:https://www.cnblogs.com/najifu-jason/p/4122741.html IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC ...

  9. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals)

    题目链接:http://codeforces.com/contest/828 A. Restaurant Tables time limit per test 1 second memory limi ...

  10. NET LOCALGROUP命令详解(将用户添加到管理员组等)

    NET LOCALGROUP [groupname [/COMMENT:"text"]] [/DOMAIN] groupname {/ADD [/COMMENT:"tex ...