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,讲的比较清楚
__in DWORD flOptions,
__in SIZE_T dwInitialSize,
__in SIZE_T dwMaximumSize
);
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库中,这个库就会创建私有堆(在调用进程中)
然后就在这个堆上不停的heapalloc?不理解怎么在一个堆上,不停申请空间
如果说堆的开始地址是一样的话,那么多次调用heapalloc,是系统自己在堆上,连续开辟空间
而不需要人为每次指定不同的堆开始地址?
在
某些应用场合,可能会在某一个时间段内,或者某一个任务内需要大量的内存,并且可能是一个个很小很小的分片。如果全都使用默认的堆,那么全用完之后,需要
释放就显得相当麻烦,必须一个个的释放,而如果这个作业中途异常,可能导致一些内存分片的句柄丢失,则释放就更加麻烦,又不能枚举出来一个个释放
,如此就很容易造成内存丢失,但是在这种情况下,就可以通过HeapCreate创建一个独立的内存堆,当应用完之后,直接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的更多相关文章
- 创建堆 HeapCreate
创建额外的堆的原因1.对组件进行保护2.更有效的内存管理3.局部访问4.避免线程同步开销5.快速释放 HeapCreate函数原型:HANDLE WINAPI HeapCreate( _In_ DWO ...
- HeapCreate深入研究
本机:win7(x86),4G内存 #include"stdafx.h"#include<windows.h>#include<stdio.h>#inclu ...
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)
上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...
- C/C++内存分配
一. 预备知识—程序的内存分配: 一个由C/C++编译的程序占用的内存分为以下几个部分:1.栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...
- C#封装好的Win32API
Kernel.cs using System; using System.Runtime.InteropServices; using System.Text; using HANDLE = Syst ...
- malloc 函数工作机制(转)
malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...
- Windows内存小结
以前写过一篇理解程序内存, 当时主要是针对用户态,下面再稍微深入一点: 我们以32位程序为例(不启用AWE), 总共4G虚拟空间,其中低2G属于用户态, 高2G属于操作系统内核, 每个程序都有自己的低 ...
- 哈夫曼树(二)之 C++详解
上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...
- Pooled Allocation(池式分配)实例——Keil 内存管理
引言:说到动态申请(Dynamic Allocation)内存的好处,学过C/C++的人可能都有体会.运行时的灵活申请自然要比编码时的猜测好的多.而在内存受限情况下这种灵活性又有特别的好处--能让我们 ...
随机推荐
- 使用Scrapy采集
1.有些站点通过robot协议,防止scrapy爬取,就会出现如下问题: DEBUG: Forbidden by robots.txt: <GET http://baike.baidu.com/ ...
- 九度OJ 1161:Repeater(复制器) (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1449 解决:508 题目描述: Harmony is indispensible in our daily life and no one ...
- Cauchy sequence Hilbert space 希尔波特空间的柯西序列
http://mathworld.wolfram.com/HilbertSpace.html A Hilbert space is a vector space with an inner prod ...
- 流畅python学习笔记第十八章:使用asyncio包处理并发(一)
首先是线程与协程的对比.在文中作者通过一个实例分别采用线程实现和asynchio包实现来比较两者的差别.在多线程的样例中,会用到join的方法,下面来介绍下join方法的使用. 知识点一:当一个进程启 ...
- python网络爬虫之使用scrapy自动登录网站
前面曾经介绍过requests实现自动登录的方法.这里介绍下使用scrapy如何实现自动登录.还是以csdn网站为例. Scrapy使用FormRequest来登录并递交数据给服务器.只是带有额外的f ...
- Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)
一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个 ...
- iOS开发的10个奇袭
1.关于关键字volatile 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这 ...
- 校园网络 usaco
这道题和上一道[最受欢迎的牛]差不多,都是强连通分量的练习题: 第一问实际上就是问缩点后入度为0的点有多少,第二问就是问添加几条边能使缩点后的图变成强连通图: 第一问好做,第二问需要动下脑子,也不难: ...
- 【css学习整理】css基础(样式,语法,选择器)
CSS是什么? cascading 层叠样式表 sheet 样式文件 style 外观个性化 CSS语法? 声明方法: 选择器(属性: 值; 属性: 值) 选择器: 通过名称制定对哪些标签进行样式设置 ...
- 如何识别真Microsoft服务与非Microsoft服务来定位病毒自己的服务
在我当网管的那段时间,发现有病毒入侵客户服务器,该病毒伪装自己的进程名,我们在服务中发现其也有伪装成系统服务的服务在运行,占用客户服务器的性能,使得CPU与内存的利用率达到90%以上,并持续时间长,甚 ...