HeapCreate()

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

HeapCreate

这个函数创建一个只有调用进程才能访问的私有堆。进程从虚拟地址空间里保留出一个连续的块并且为这个块特定的初始部分分配物理空间。


HANDLE HeapCreate(DWORD flOptions , DWORD dwInitialSize , DWORD dwMaxmumSize);

参数:

flOptions:堆的可选属性。这些标记影响以后对这个堆的函数操作,函数有:HeapAlloc , HeapFree , HeapReAlloc , HeapSize .

下面给_出在此可以指定的标记:

HEAP_NO_SERIALIAZE:指定当函数从堆里分配和释放空间时不互斥(不使用互斥锁)。当不指定该标记时默认为使用互斥。序列化允许多个线程操作同一个堆而不会错误。这个标记是可忽略的。

HEAP_SHARED_READONLY:这个标记指定这个堆只能由创建它的进程进行写操作,对其他进程是只读的。如果调用者不是可靠的,调用将会失败,错误代码ERROR_ACCESS_DENIDE 。

注解:为了使用标记为HEAP_SHARED_READONLY的堆,运行在kernel mode(核心状态)是必须的。

dwInitialSize:堆的初始大小,单位为Bytes。这个值决定了分配给堆的初始物理空间大小。这个值将向上舍入知道下个page boundary(页界)。若需得到主机的页大小,使用GetSystemInfo 函数。

dwMaxmumSize:如果该参数是一个非零的值,它指定了这个堆的最大大小,单位为Bytes。该函数会向上舍入该值直到下个页界,然后为这个堆在进程的虚拟地址里保留舍入后大小的块。如果函数 HeapAlloc 和 HeapReAlloc 要求分配的空间超过参数 dwInitialSize 指定的大小,系统会分配额外的空间给该堆直到这个堆的最大大小。If dwMaximumSize is nonzero, the heap cannot grow and an absolute limitation arises where all allocations are fulfilled within the specified heap unless there is not enough free space. (如果该参数非零,除非没有足够的空间,这个堆总可以增长到该大小)。如果该参数为零,那么该堆大小的唯一限制是可用的内存空间。分配大小超过 0x0018000 Bytes的空间总会失败,因为获得这么大的空间需要系统调用 VirtualAlloc 函数。需要使用大空间的应用应该把该参数设置为零。

返回值:

成功:一个指向新创建的堆的指针。

失败:NULL

调用函数 GetLastError 获得更多的错误信息。

附注:

这个函数在调用进程里创建一个私有堆,进程可调用 HeapAlloc 函数分配内存空间。这些页在进程的虚拟空间内创建了一个块,在那里堆可以增长。

如果 HeapAlloc 函数请求的空间超过了现有的页大小,如果物理空间足够的话,额外的空间将会从已保留的空间里附加。

只有创建私有堆的进程可以访问私有堆。

如果一个DLL(动态链接库)创建了一个私有堆,那么这么私有堆是在调用该DLL的进程的地址空间内,且仅该进程可访问。

系统会使用私有堆的一部分空间去储存堆的结构信息,所以,不是所有的堆内空间对进程来说是可用的。例如:HeapAlloc函数从一个最大大小为 64KB 的堆里申请 64KB 的空间,由于系统占用的一部分空间,这个请求通常会失败。

要求:

系统版本:WinCE 1.0 以上。

头文件:Winbase.h

链接库:Coredll.lib


共享Windows下C++库之内存池篇 目录结构 内存池简介 介绍分析内存池改进及所使用技术 如何配合STL容器 性能测试 如何使用   阅读详情

相关推荐

线程安全:分配堆与内存 API:HeapCreate HeapAlloc HeapSize HeapFree HeapDestroy

/* * 创建指定大小的堆 *判断当前进程堆的个数 *在指定的堆上分配内存 *获取 堆分配的内存块的大小 * 释放堆分配的内存 *销毁HeapCreate 创建的堆 */ #include #include using namespace std; void main() { //定义变量 HANDLE hHeap; //堆句柄 SYSTEM_INFO si; //定

minaiyi的专栏 4145

C++ 内存池私有堆实现

C++ 内存池私有堆 实现 测试代码 私有堆管理类 1. CPrivateHeap: 自动创建和销毁进程私有堆 每一个该类的对象都代表一个私有堆, 所以该类对象的特点是: 一般声明周期都比较长 通常作为全局对象, 其他类的静态成员对象或者一些长生命周期类对象的成员对象 2. CPrivateHeapBuffer: 在私有堆中自动分配和释放指定大小的内存 一般用于在函数体内分配和释放局部作用域的堆内存 从而避免对 CPrivateHeap::Alloc() 和 CPrivateHeap::Free() 的调用

【编译、链接、装载十四】堆与内存管理

光有栈对于面向过程的程序设计还远远不够, 因为栈上的数据在函数返回的时候就会被释放掉, 所以无法将数据传递至函数外部。而全局变量没有办法动态地产生, 只能在编译的时候定义, 有很多情况下缺乏表现力。在这种情况下, 堆(Heap) 是唯一的选择。堆是一块巨大的内存空间, 常常占据整个虚拟空间的绝大部分。在这片空间里, 程序可以请求一块连续内存, 并自由地使用, 这块内存在程序主动放弃之前都会一直保持有效。下面是一个申请堆空间最简单的例子。

junxuezheng的博客 588

windows 堆:入门学习

堆是Windows操作系统在运行时对系统资源的管理方式,是一种动态内存分配系统,可以在程序运行时动态地分配和释放内存。Windows提供了各种堆操作函数,如HeapCreateHeapDestroy、HeapAlloc、HeapReAlloc、HeapFree等。然而,在一般的程序开发过程中,我们往往不会直接使用这些底层的堆操作函数,因为这些函数的使用往往需要对Windows内存管理的深入理解和小心翼翼的错误处理。

qq_39267690的博客 1355

堆的实现和总结

堆的介绍和实现

m0_72873854的博客 608

HeapCreate

每个进程都有个默认堆,在main函数入口之前CRT又创建了一个C运行时堆。 当用new来分配内存时候,实际上是在运行时堆上分配内存。 默认系统为每一个进程都分配一个Heap,可以使用GetProcessHeap取得,其句柄。但是这个堆,是不允许程序自己释放,也就是不允许Destroy。 当用LocalAlloc或是GlobalAlloc分配内存时是在进程默认堆上分配的。在某些应用场合,可能会在

xuleisdjn的专栏 963

HeapCreate()中的HEAP_GENERATE_EXCEPTIONS选项

    HeapCreate() 函数在创建私有堆时可以使用HEAP_GENERAT_EXCEPTIONS选项,以使得创建失败时函数抛出异常,而非简单返回NULL。    在《win32汇编》一书中给出的代码是:调用HeapCreate()后,判断eax && (eax     c0000000h容易理解,在《Windows Via C/C++》一书中,x86 32-bit Windows

珂珂的专栏 2357

05-树7 堆中的路径 (25分)

05-树7 堆中的路径 (25分) 将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。 输出格式: 对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。 输入样例: 5 3 46

shshbdhsjjd的博客 242

侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (一)

HeapAlloc:HeapAlloc是Windows提供的API,在进程初始化的时候,系统会在进程的地址空间中创建1M大小的堆,称为默认堆(Default Heap),该大小为默认值,可以通过/HEAP连接器开关进行修改。如果客户要的区块大小要小于sbh_threshold(size=1016,加上图中的上下的00000131(各占4个字节),1016+8=1024,即1K),将从sbh内部去申请内存。任何的c/c++程序,在main函数之前,有一个启动函数,你的main函数必须由启动码函数调用起来。

生活需要深度 729

【操作系统】存储器管理实验

文章目录实验目的实验内容实验准备相关理论知识相关系统调用的解释GetProcessMemoryInfoHeapAlloc实验过程源代码实验心得 实验目的 理解WINDOWS中堆、栈的内存布局 通过WNDOWS系统提供的系统调用HeapCreate(), HeapAlloc(), HeapFree()等函数的应用,理解虚拟内存管理技术中的内存分配原理。使用工具软件vmmap查看某个进程的虚拟地址空...

cout0 2290

程序员自我修养笔记:第十章

第十章 内存 1.调用惯例 一个调用惯例,一般会规定如下几方面的内容: 函数参数的传递顺序和方式: 参数的压栈顺序,有些惯例还允许使用寄存器传递参数。 站的维护方式: 参数的弹出工作是由函数的调用方还是函数本身来完成 名字修饰策略 函数返回值传递 2.堆 程序向操作系统申请一块适当大小的堆空间,然后由程序自己管理这块空间。这个程序往往是程序的运行库。 3.Linux下的对空间分配方式有两个系统调用,一个是brk(),另外一个是mmap()。 brk()就是设置进行数据段(bss+数据段)的结束地址,

weixin_45719581的博客 320

创建堆 HeapCreate

创建额外的堆的原因1.对组件进行保护2.更有效的内存管理3.局部访问4.避免线程同步开销5.快速释放 HeapCreate函数原型:HANDLE WINAPI HeapCreate( _In_DWORD flOptions, _In_SIZE_T dwInitialSize, _In_SIZE_T dwMaximumSize); 第一参数flOptions 表示对堆的操作如何进...

weixin_30636089的博客 640

堆分配函数:HeadAlloc , GetProcessHeap , HeapCreate

关于堆分配的几个函数: (1)GetProcessHead 用以获取和调用进程的堆句柄. typedef struct { char data[128]; }Data,*LPData; LPData lpData; lpData = (LPData)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(Da

bobopeng 4253

关于HeapCreate(1)

这个最好看MSDN,讲的比较清楚 http://msdn.microsoft.com/en-us/library/aa366599(VS.85).aspx 不过要注意以下几点: 1 申请的私有内存只能被调用进程(就是call这个api的进程)使用 2 HANDLE WINAPI HeapCreate( __in DWORD flOptions, __in SIZE_T d...

weixin_34009794的博客 144

windows编程,进程的默认堆中分配内存的示例, HeapCreate, HeapDestroy, HeapAlloc, HeapFree, HeapSize

之前写的一点windows下编程的内容,每一篇都会设立几个目标(题目来自国外某大学),并写一个可运行的实例出来用于熟悉各种API,并把相关的API的官方MSDN文档附上,大伙可自行参考学习相关API用法。

why_so_hot的博客 431

HeapCreate深入研究

本机:win7(x86),4G内存 #include"stdafx.h"#include<windows.h>#include<stdio.h>#include<tchar.h>#include<iostream>using namespace std;HANDLE hHeap;int _tmain(int argc, _TCHAR* argv[]...

weixin_30347009的博客 331

HeapCreate第三个参数dwMaximumSize

dwMaxmumSize:如果该参数是一个非零的值,它指定了这个堆的最大大小,单位为Bytes。该函数会向上舍入该值直到下个页界,然后为这个堆在进程的虚拟地址里保留舍入后大小的块。如果函数 HeapAlloc 和 HeapReAlloc 要求分配的空间超过参数 dwInitialSize 指定的大小,系统会分配额外的空间给该堆直到这个堆的最大大小。如果该参数非零,除非没有足够的空间,这个堆总可以增

shangcangriluo的专栏 546

粗解“new”之来龙去脉(三)

我们暂且停止对内存分配的查找,看看这些变量是何时被初始化的,通过查找源代码我们可以看到是在__sbh_heap_init中对它赋值的。 HANDLE _crtheap;int __cdecl __sbh_heap_init (void) { if (!(__sb

899
上一篇: HeapAlloc()
下一篇: ReadProcessMemory()
windroid
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值