程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 內存管理[5]

內存管理[5]

編輯:Delphi

本例在建立一個新的堆前後分別通過 GetProcessHeaps 函數獲取了當前進程的堆句柄列表, 沒想到一個最簡單的程序也有 5 個堆.

  效果圖:

內存管理[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;


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved