创建堆 HeapCreate
创建额外的堆的原因
1.对组件进行保护
2.更有效的内存管理
3.局部访问
4.避免线程同步开销
5.快速释放
HeapCreate函数原型:
HANDLE WINAPI HeapCreate(
_In_ DWORD flOptions,
_In_ SIZE_T dwInitialSize,
_In_ SIZE_T dwMaximumSize
);
第一参数 flOptions 表示对堆的操作如何进行,可以是0,HEAP_NO_SERIALIZE,HEAP_GENERATE_EXCEPTIONS,HEAP_CREATE_ENABLE_EXECUTE。
默认情况下,对堆的访问会依次进行,多个线程会从同一个堆中分配释放内存,堆数据不被破坏。
但在多线程情况下,要尽量避免使用HEAP_NO_SERIALIZE。如果想在堆中放可执行代码,必须使用 HEAP_CREATE_ENABLE_EXECUTE。
第二参数dwInitialSize表示开始时分给堆的字节数。
第三参数dwMaximumSize表示所能增长到的最大大小,如果指定为0的话,则堆可以在需要的情况下不断增大。
从堆里分配内存块,只需调用HeapAlloc()函数
LPVOID
WINAPI
HeapAlloc(
_In_ HANDLE hHeap,
_In_ DWORD dwFlags,
_In_ SIZE_T dwBytes
);
这里说一下第三参数,用来指定一些标志,会对分配结果产生影响。目前只支持这三个参数,HEAP_ZERO_MEMORY,HEAP_GENERATE_EXCEPTIONS,HEAP_NO_SERIALIZE。
HEAP_ZERO_MEMORY是把内存清空,
HEAP_GENERATE_EXCEPTIONS告诉系统,如果没有足够的空间,就抛出异常,
HEAP_NO_SERIALIZE用来强制系统不要把这次分配结果与其他线程的访问排列起来,有可能破坏堆的完整性。
在分配大于1MB 的内存时,建议使用VirtualAlloc 函数。
低碎片堆
如果产生了内存碎片,我们可以强制操作系统使用低碎片堆的算法,《Windows核心编程》上举了一个例子,
VOID Sub_1()
{
HANDLE hCHeap = GetProcessHeap();
WCHAR buf[10] = { 0 };
ULONG ulHeapCompatibilityInformation;
ulHeapCompatibilityInformation = 2;
if (HeapSetInformation(hCHeap, HeapCompatibilityInformation, &ulHeapCompatibilityInformation,
sizeof(ulHeapCompatibilityInformation)))
{
wprintf(L"Heap algorithm set to %s Low-fragmentation heap(handle=0x%x)\n", buf[0], hCHeap);
}
else
{
wprintf(L"Unable to set Heap information to %s (handle=0x%x)GetLastError()= %d 0x%x\n",
buf[0], hCHeap, GetLastError(), GetLastError());
}
}
创建堆 HeapCreate的更多相关文章
- 创建堆(python)
创建最大(小)堆 二叉堆本质上是一种完全二叉树,存储方式并不是链式存储,而是顺序存储 堆操作:插入(叶子节点上调),删除(堆顶元素下沉) 堆创建:非叶子节点下沉(从最后一个非叶子节点开始) 最小堆: ...
- 对弈win32笔记
对弈的win32笔记 一:Windows程序运行原理 一.Windows四大模块程序 1.1控制台程序 没有自己的窗口,dos-显示或者运行程序,入口mian() 1.2窗口程序 有自己的窗口,w ...
- 控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量
我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的.但是 ...
- Windows编程中的堆管理(过于底层,一般不用关心)
摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多 ...
- windows程序员进阶系列:《软件调试》之Win32堆
win32堆及内部结构 Windows在创建一个新的进程时会为该进程创建第一个堆,被称为进程的默认堆.默认堆的句柄会被保存在进程环境块_PEB的ProcessHeap字段中. 要获得_PEB的地址, ...
- windows程序员进阶系列:《软件调试》之Win32堆的调试支持
Win32堆的调试支持 为了帮助程序员及时发现堆中的问题,堆管理器提供了以下功能来辅助调试. 1:堆尾检查(Heap Tail Check) HTC,在堆尾添加额外的标记信息,用于检测堆块是否溢出. ...
- 利用DWORD SHOOT实现堆溢出的利用(先知收录)
原文链接:https://xz.aliyun.com/t/4009 1.0 DWORD SHOOT是什么捏? DWORD SHOOT指能够向内存任意位置写入任意数据,1个WORD=4个bytes,即可 ...
- Windows7 x64 了解堆
一.前言 堆对于开发者一般来说是熟悉又陌生的,熟悉是因为我们常常使用new/delete或者malloc/free使用堆,陌生是因为我们基本没有去了解堆的结构.堆在什么地方?怎么申请?怎么释放?系统又 ...
- 转:win32下的堆管理系统
转:https://bbs.pediy.com/thread-224136.htm 准备刷漏洞战争中的堆溢出部分,但是对于堆的了解较少,在这里记录一下关于堆的学习记录,有错误请各位大大拍砖 参考: & ...
随机推荐
- Git 相关工具及教程地址
一.Git GUI 客户端 Git 客户端下载(Windows) TortoiseGit 客户端下载(Windows) Sourcetree 客户端下载(Windows.Mac) Git Extens ...
- Python 3基础教程32-正则
本文介绍Python的正则,通过本文介绍和一个练习,对正则有一个基本了解就可以. # 正则表达式 ''' 正则表达式是有一些特殊字符组成,能够帮你找到一些符合一定规则的字符串 先来了解几个符号所代表的 ...
- K8s集群内热改代码
1.登录到k8s master服务器 $ ssh developer@XXX.XXX.X.XXX(IP地址) 2.查看服务容器所在的节点(以xx-server为例) $ kubectl get pod ...
- 第十篇 Python的字符串格式化
字符串格式化:就是按照你的意愿做一个拼接的过程. 1. 字符串格式化的第一种方式:百分号方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. %[ ...
- 一篇文章解决django中时区问题
首先要明确的是,当在Django项目的setting.py文件中设置了USE_TZ=True时,我们给定的时间存储到数据库的时候都会变成UTC时间(使用auto_now_add和auto_now为Tr ...
- POJ 1144 Network(割点)
Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are c ...
- ExtJS6.0扩展日期选择控件为也可以选择时间
PS:ExtJS自带的日期选择控件只能够选择日期,但是现在的需求需要精确到秒,所以在网上搜索了一些例子(大部分是4.0的)作为参考,然后改出了6.0可用的一个日期时间选择控件. 1.找到extjs6. ...
- 用OneNote写博客的方法
1.进入OneNote要发布博客的分区然后点击菜单栏中的文件 2.点击发送至博客 3.这时候会启动word程序弹出下面的对话框(如果你从未设置过)点击立即注册 ...
- WEB-INF目录
背景: 在项目中,使用 "${pageContext.request.contextPath}/image/01.jpg"获取不到该图片.在浏览器中直接输入地址也找不到,报错404 ...
- MySQL密码忘了怎么办
之前在ubuntu 12.04里安装了xampp,设置了mysql数据库root密码,今天需要增加个数据库,发现忘记之前设置的密码是什么了.经过一番摸爬滚打,终于搞明白了,注意以下的操作都是以linu ...