堆函数

Heap Functions

每个进程有一个系统提供的默认堆。频繁从堆分配内存的应用程序可以通过使用私有的堆来提高性能。

私有堆调用进程地址空间中有一个或者多个页的内存块。在创建这个私有堆后,进程使用诸如HeapAlloc,HeapFree的函数来管理堆上的内存。

通过使用函数GetProcessHeap返回的句柄,这些堆函数也可以用来管理进程默认堆上的内存。新的应用程序应该使用这些堆函数而不是全局或者局部函数来达到这个效果。

从私有堆上分配的内存和通过其它内存分配函数分配的内存没有什么区别。

注意,通过函数GetProcessHeap,或者HeapCreate返回的句柄,线程只能为进程的默认堆或者线程创建和管理的私有堆调用堆函数。

通过调用进程来调用函数HeapAlloc函数,HeapCreate函数创建一个私有堆。HeapCreate函数指定一个堆内存的初始化大小和最大大小。初始化的尺寸决定一个初始化分配的读/写页面的数目。最大尺寸决定所有保留页面的数目。这些页面在进程的堆可以增长的地址空间中创建一个连续的内存块。如果HeapAlloc函数的请求超过了当前提交页面的大小,附加的页面会从保留的空间中自动的提交(加上物理存贮足够的话)。一旦页面提交,他们就不会被撤销直到进程被终结或者通过调用HeapDestroy导致

堆被释放。

私有堆对象的内存只能被创建它的进程所访问。如果一个dll创建一个私有堆,那么它是在调用它的进程的地址空间中创建的。它只能访问那个进程。

HeapAlloc 函数从从一个私有堆里面分配一定数目的字节并且返回一个指向分配区域的指针,这个指针可以被用在函数

HeapFree,HeapReAlloc,HeapSize,HeapValidate中。

通过HeapAlloc分配的内存是不能移动的。HeapAlloc函数返回的地址是有效的直到内存块被释放或者重新分配;内存块不需要来被锁定。

因为系统不能压缩私有堆,所以它可能变得支离破碎。应用程序使用不同大小的分配尺寸分配大量的堆时可以使用low-fragmentation来降低堆的破碎。

堆函数一个可能的使用就是在进程启动的时候创建一个私有堆,指定一个足够大小的内存来满足进程所需要的内存。如果调用调用HeapCreate函数失败,那么进程终止或者通知用户内存短缺;如果成功,那么就是进程确保有足够的它需要的内存。

HeapCreate请求的内存可能是或者可能不是连续的。在同一个堆中通过HeapAlloc分配的内存是连续的。你不能读写一个堆的内容除非他是函数HeapAlloc分配的,也不应该去假设HeapAlloc函数分配的不同内存区域的联系。

你也不能引用函数HeapFree已经释放的内存。在内粗被释放后,之前包含的任何信息都已经永远消失了。如果你需要那些信息,就不要释放包含信息的内存。调用返回堆信息的函数诸如HeapSize,可能没有作用了如果内存已经被释放,这样它可能返回虚假的数据。

HeapDestroy函数破坏私有堆对象。它收回和释放堆对象的的所有页面并且使堆句柄无效。

http://msdn.microsoft.com/en-us/library/aa366711(v=vs.85).aspx

时间: 2024-10-10 11:22:45

堆函数的相关文章

堆区函数

070.堆函数 一个进程或者说一个程序.可能有多个线程.单线程每个线程都有自己专属的栈(stack).栈的最大尺寸是固定的,在OD的右下角,我们都看到过,超过那个范围就会引起栈溢出.堆上的内存必须手工释放(C/C++),有的编程语言比如Java.Net不需要手动管理堆内存,语言本身有GC(垃圾回收机制)则另谈.以后我们再来讨论这个问题. 函数内部的局部变量(auto以及参数)一旦,函数运行完毕,则会自动从栈上释放. int f_abc(int p_v1,int p_v2){// C语言的形参是从

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

进程默认堆和额外创建的堆

在<Windows核心编程>第五版的第十八章 <堆> 中提到了进程默认堆和额外创建的堆.这在编程中是十分重要的知识,今天整理一下. 1,堆非常适合分配大量的小型数据.使用堆可以让程序员专心解决手头的问题,而不必理会分配粒度和页面边界之类的事情.因此堆是管理链表和数的最佳方式.但是堆进行内存分配和释放时的速度比其他方式都慢,而且无法对物理存储器的调拨和撤销调拨进行控制. 为了能适应各种硬件平台,如果程序员想要控制物理存储器的调拨和撤销调拨,就不应该使用堆,而应该使用虚拟内存(Virt

Windows编程中的堆管理(过于底层,一般不用关心)

摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多数Windows应用程序设计中,都几乎不可避免的要对内存进行操作和管理.在进行大尺寸内存的动态分配时尤其显的重要.本文即主要对内存管理中的堆管理技术进行论述. 堆(Heap)实际是位于保留的虚拟地址空间中的一个区域.刚开始时,保留区域中的多数页面并没有被提交物理存储器.随着从堆中越来越多的进行内存分

堆区和栈区的区别

堆和栈的区别一.预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量

[c++]堆和栈的区别

堆和栈的区别一.预备知识-程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量

全局和局部函数

全局和局部函数   全局和局部函数是为了支持16bit的程序移植,或者是为了维护程序对16bit Windows的兼容性.从32bit Windows起,全局函数和局部函数的实现是封装一个相关的堆函数,这个堆函数用进程的默认堆的句柄.因此全局和局部函数比其它内存管理函数开销更大. 堆函数比全局和局部函数提供更多的特征和控制.新的程序应该使用堆函数除非文档特别地指出应该使用全局或者局部函数.例如,一些Windows程序必须使用LocalFree来释放分配的内存,并且全局函数在DDE(动态数据交换)

转载:堆和栈的学习

堆和栈的区别一.预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初

堆——练习题

--堆是一个很好用的东西,但遗憾的是,在oi混了三年多的我居然到现在才会--惭愧惭愧-- 堆可以在O(log n) 的时间内查询最大值和最小值,非常好用的一个数据结构,本人认为比优先队列快得多--只是本人观点-- 手写堆:不好写--没写过--反正c++有stl库(等到了左偏树再学--) stl堆:感谢c++有stl这种省时省力的好东西,要是noip开放所有库并允许o2 o3优化就更好了(退役之前不用想了) stl堆函数: make_heap:将一个数组建堆,例:对a[1]到a[100]建堆:ma