Wyciek pamięci w liście jednokierunkowej

0

Witam, ostatnio zabrałem się za pisanie listy zdarzeń do gierki RPG i wszystko szło dobrze, ale gdzieś mam wyciek pamięci i nie mogę go zlokalizować, przypuszczam że ma to związek z użyciem obiektu TEvent1, zresztą sami zobaczcie kod:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  PEvent1 = ^TEvent1;
  TEvent1 =
  object
    msg: string;
    procedure Process;
  end;

  PMapEvent = ^TMapEvent;
  TMapEvent =
  record
    EventType: Word;
    Event: Pointer;
    NextEvent: PMapEvent;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TEvent1.Process;
begin
  Form1.ListBox1.Items.Add(msg);
end;

procedure AddEvent(event: Pointer;eventlist: PMapEvent; id: Word);
begin
  New(eventlist.NextEvent);
  eventlist^.NextEvent.EventType := id;
  eventlist^.NextEvent.Event := event;
  eventlist^.NextEvent.NextEvent := nil;
end;

procedure ProcessEvents(event: PMapEvent);
var
  temp: PMapEvent;
begin
  temp := event;
  while (temp <> nil) do
  begin
    case temp.EventType of

      1:
      begin
        TEvent1(temp.Event^).Process;
      end;

    end;
    temp := temp^.NextEvent;
  end;
end;

function CreateMsgEvent(msg: string): Pointer;
var
  temp: PEvent1;
begin
  New(temp);
  temp^.msg := msg;
  Result := temp;
end;

procedure FreeEvents(event: PMapEvent);
var
  temp: PMapEvent;
begin
  while (event <> nil) do
  begin
    temp := event^.NextEvent;
    event^.NextEvent := nil;
    Dispose(event.Event);
    event.Event := nil;
    Dispose(event);
    event := temp;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  firstevent: TMapEvent;
  event: PMapEvent;
  e: TEvent1;
begin
  ListBox1.Clear;
  e.msg := '1st Event';
  firstevent.EventType := 1;
  firstevent.Event := @e;
  event := @firstevent;
  AddEvent(CreateMsgEvent('Event nr 2'),event, 1);
  event := event^.NextEvent;
  AddEvent(CreateMsgEvent('Event three'),event, 1);
  ProcessEvents(@firstevent);
  FreeEvents(firstevent.NextEvent);
end;

end.

PROSZĘ O POMOC W ZNALEZIENIU WYCIEKU PAMIĘCI

0

sam sobie znajdz.
Nie lubimy takich, ktorzy oczejuja gptowych rozwiazan.
Krol Bobasza I

1 użytkowników online, w tym zalogowanych: 0, gości: 1