VirtualAlloc在原基础上再分配内存

Posted on 2010-09-04 23:12  品味人生  阅读(535)  评论(0)    收藏  举报

VirtualAlloc详细说明请参考:http://baike.baidu.com/view/1521481.htm?fr=ala0_1_1


unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

type

  TStruct = packed record

    SysAutoID: integer;

    Text: string[10];

    StkID: string[20];

   end;

   PTStructArray = ^TStructArray;

   TStructArray = array[0..1000] of TStruct;

type

  TForm1 = class(TForm)

    Memo1: TMemo;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

  private

    { Private declarations }

      FPArray :PTStructArray;

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

  i :Integer;

begin

  FPArray := Windows.VirtualAlloc(nil, 10 * SizeOf(TStruct), MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);//分配10个大小

  for i := 0 to 9 do

  begin

    FPArray^[i].SysAutoID := i;

    FPArray^[i].Text      := 'Text' + IntToStr(i);

    FPArray^[i].StkID     := 'STKID' + IntToStr(i);

  end;

end;

procedure TForm1.Button3Click(Sender: TObject);

var

  i :Integer;

begin

  Windows.VirtualAlloc(FPArray, 12 * SizeOf(TStruct), MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);

  //在原基础上再分配2个大小,原来内存的内容不变

  for i := 10 to 11 do

  begin

    FPArray^[i].SysAutoID := i;

    FPArray^[i].Text      := 'Text' + IntToStr(i);

    FPArray^[i].StkID     := 'STKID' + IntToStr(i);

  end;

  Memo1.Clear;

  for i := 0 to 11 do

    Memo1.Lines.Add(IntToStr(FPArray^[i].SysAutoID) + '  ' + FPArray^[i].Text + '  ' + FPArray^[i].StkID);

  Windows.VirtualFree(FPArray, 0, MEM_RELEASE); //释放内存

end;

end.

 

原创作品,发表地:广州  发表人:林寿全  时间:2010.09.04 23:11

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3