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++的人可能都有体会.运行时的灵活申请自然要比编码时的猜测好的多.而在内存受限情况下这种灵活性又有特别的好处--能让我们 ...
随机推荐
- EasyPlayerPro(Windows)流媒体播放器开发之框架讲解
EasyPlayerPro for Windows是基于ffmpeg进行开发的全功能播放器,开发过程中参考了很多开源的播放器,诸如vlc和ffplay等,其中最强大的莫过于vlc,但是鉴于vlc框架过 ...
- 九度OJ 1008:最短路径问题 (最短路)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8064 解决:2685 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费 ...
- 不依赖外部js es 库 实现 点击内容 切换
<!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <meta http-equiv=&qu ...
- HTML5+ 权限设置
API分模块封装调用了系统各种原生能力,而部分能力需要使用到Android的permissions,以下列出了各模块(或具体API)使用的的权限: -------------------------- ...
- SecureCRT 会话设置项
登陆动作------自动登陆仿真------两个颜色复选框都勾上模式------光标键模式(2个复选框)映射键------使用windows复制和粘贴热键外观------字符编码:UTF-8外观--- ...
- P3209 [HNOI2010]平面图判定
P3209 [HNOI2010]平面图判定 哈密尔顿环之外的任意一条边,要么连在环内部,要么连在环外部 判断两条边在同一部分会相交,则这两条边必须分开 那么把边看作点连边,跑二分图染色就行 #incl ...
- 一次跨域请求出现 OPTIONS 请求的问题及解决方法
问题背景浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 在前后端开发过程经常会遇到跨域问题.网上也都有解决方案. 写这篇文章时,我们碰到的一个场景是:要给s系统做一 ...
- 【转】PHP生成器 (generator)和协程的实现
原文地址:https://phphub.org/topics/1430 1.一切从 Iterator 和 Generator 开始 为便于新入门开发者理解,本文一半篇幅是讲述迭代器接口(Iterato ...
- html5--1.10绝对路径和相对路径
html5--1.10绝对路径和相对路径 学习要点: 绝对路径和相对路径 1.绝对路径 需要指出链接资源的绝对位置,与你的HTML文档的位置无关: 1. 服务器中的位置:href="http ...
- Intellij IDEA 14代码错误提示如何调出来