内存管理[5]通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表

本例在建立一个新的堆前后分别通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表, 没想到一个最简单的程序也有 5 个堆.



效果图:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{把下面两个过程公用的部分提取为一个独立的过程}
procedure GetHeaps(List: TStrings);
var
  HeapArr: array[0..9] of THandle; {对列表数组, 先假定有 10 堆}
  n: Integer;
  i: Integer;
begin
  {获取进程中的堆列表; 函数的参数1是数组大小, 参数2是数组的第一个元素, 返回堆的实际数量}
  n := GetProcessHeaps(Length(HeapArr), HeapArr[0]);
  List.Add(Format(‘当前进程共有 %d 个堆‘, [n]));

  List.Add(‘它们的句柄分别是:‘);

  for i := 0 to n - 1 do
    List.Add(IntToStr(HeapArr[i]));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;

  {调用公用过程, 在 Memo1 中显示堆句柄列表}
  GetHeaps(Memo1.Lines);

  {再次添加默认堆的句柄}
  Memo1.Lines.Add(‘‘);
  Memo1.Lines.Add(‘默认堆的句柄是:‘);
  Memo1.Lines.Add(IntToStr(GetProcessHeap));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyHeap: THandle;
begin
  {创建新堆}
  MyHeap := HeapCreate(0, 1024*1024*2, 0); {建立个 2M 的堆}

  Memo2.Clear;

  {调用公用过程, 在 Memo2 中显示堆句柄列表}
  GetHeaps(Memo2.Lines);

  {再次添加新建堆的句柄}
  Memo2.Lines.Add(‘‘);
  Memo2.Lines.Add(‘新建堆的句柄是:‘);
  Memo2.Lines.Add(IntToStr(MyHeap));

  {销毁新建堆}
  HeapDestroy(MyHeap);
end;

end.
时间: 2024-10-10 18:01:32

内存管理[5]通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表的相关文章

Linux-0.11内核源码分析系列:内存管理get_empty_page()与put_page()函数分析

/* *Author : DavidLin *Date : 2014-11-22pm *Email : [email protected] or [email protected] *world : the city of SZ, in China *Ver : 000.000.001 *history : editor time do * 1)LinPeng 2014-11-22 created this file! * 2) */ <pre name="code" class

Linux-0.11内核源码分析系列:内存管理up_wp_page()与do_wp_page()函数分析

/* * up_wp_page()函数用于解除物理页的共享状态,同时给发生写时复制的进程提供一页新的 * 物理页,新物理页是之前共享页的数据相同的拷贝. * table_entry是共享物理页的地址的指针,即页表实际地址+表内偏移地址 */ void un_wp_page(unsigned long * table_entry) { unsigned long old_page,new_page; old_page = 0xfffff000 & *table_entry; //取得共享物理页实际

Redis内存管理(一)

Redis数据库的内存管理函数有关的文件为:zmalloc.h和zmalloc.c. Redis作者在编写内存管理模块时考虑到了查看系统内是否安装了TCMalloc或者Jemalloc模块,这两个是已经存在很久的内存管理模块,代码稳定.性能优异,如果已经安装的话,则使用之,最后检查是否是Mac系统,如果是Mac系统的话加载的文件不同,额,本人没进行过Mac编程,这块儿不考虑.对应的源代码为: 1 //检查是否定义了TCMalloc,TCMalloc(Thread-Caching Malloc)与

内存管理相关函数 -- Linux【转】

转自:http://blog.csdn.net/cy_cai/article/details/47001245 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) 内核空间申请指定大小的内存区域,返回内核空间虚拟地址.在函数实现中,如果申请的内存空间较大的话,会从buddy系统申请若干内存页面,如果申请的内存空间大小较小的话,会从slab系统中申请内存空间.有关buddy和slab,

FreeRTOS高级篇7---FreeRTOS内存管理分析

内存管理对应用程序和操作系统来说都非常重要.现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关.        FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的.这样做大有好处,可以增加系统的灵活性:不同的应用场合可以使用不同的内存分配实现,选择对自己更有利的内存管理策略.比如对于安全型的嵌入式系统,通常不允许动态内存分配,那么可以采用非常简单的内存管理策略,一经申请的内存,甚至不允许被释放.在满足设计要求的前提

php内存管理

1.为什么需要内存管理 由于计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的, 应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的库函数 向操作系统申请内存,在一些对性能要求较高的应用场景下是需要频繁的使用和释放内存的, 比如Web服务器,编程语言等,由于向操作系统申请内存空间会引发系统调用, 系统调用和普通的应用层函数调用性能差别非常大,因为系统调用会将CPU从用户态切换到内核, 因为涉及到物理内存的操作,只有操作系统才能进

操作系统内存管理——分区、页式、段式管理

计算存储的层次结构: 当前技术没有能够提供这样的存储器,因此大部分的计算机都有一个存储器层次结构,即少量的非常快速.昂贵.易变的高速缓存(cache):若干兆字节的中等速度.中等价格.易变的主存储器(RAM):数百兆或数千兆的低速.廉价.不易变的磁盘.这些资源的合理使用与否直接关系着系统的效率. 1. 内存管理方法 内存管理主要包括虚地址.地址变换.内存分配和回收.内存扩充.内存共享和保护等功能. 2. 连续分配存储管理方式 连续分配是指为一个用户程序分配连续的内存空间.连续分配有单一连续存储管

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,

&lt;Linux内核源码&gt;内存管理模型

题外语:本人对linux内核的了解尚浅,如果有差池欢迎指正,也欢迎提问交流! 首先要理解一下每一个进程是如何维护自己独立的寻址空间的,我的电脑里呢是8G内存空间.了解过的朋友应该都知道这是虚拟内存技术解决的这个问题,然而再linux中具体是怎样的模型解决的操作系统的这个设计需求的呢,让我们从linux源码的片段开始看吧!(以下内核源码均来自fedora21 64位系统的fc-3.19.3版本内核) <include/linux/mm_type.h>中对于物理页面的定义struct page,也