Вниз
Скачать: CL | DM;

FreeMem в списке   Найти похожие ветки 

← →
JB2   (2009-04-07 11:05) [0]

Написал класс-список для хранения определенных записей. Как правильн освободить память выделяемую под записи? Вот код:


TIntItem = packed record
   Item1: Integer;
   Item2: Integer;
 end;
 PIntItem = ^TIntItem;

 TIntList = class(TList)
 private
   function Get(Index: Integer): PIntItem;
 public
   function Add(AItem1, AItem2: Integer): Integer;
 end;



{ TIntList }

function TIntList.Add(AItem1, AItem2: Integer): Integer;
var
 P: PIntItem;
begin
 GetMem(P, SizeOf(TIntItem));
 try
   with P^ do
   begin
     Item1 := AItem1;
     Item2 := AItem2;
   end;
   inherited Add(P);
 except
   FreeMem(P);
   raise;
 end;
end;

function TIntList.Get(Index: Integer): PIntItem;
begin
 Result := PIntItem(inherited Get(Index))
end;


← →
Плохиш ©   (2009-04-07 11:07) [1]


> Как правильн освободить память выделяемую под записи?

В данном случае, с помощью FreeMem.


← →
JB2   (2009-04-07 11:12) [2]

Так?


destructor TIntList.Destroy;
var
 I: Integer;
begin
 for i := 0 to Count - 1 do
   FreeMem(Get(I));
 inherited;
end;


← →
Ega23 ©   (2009-04-07 11:22) [3]


> Так?


Можно так. Но лучше - не так:

TIntList = class (TList)
private
 function GetItem(Index: Integer): TIntItem;
protected
 procedure Notify(Ptr: Pointer; Action: TListNotification); override;
public
 function Add(Value1, Value2 : Integer) : Integer;
 procedure Clear; override;
 property Items[Index : Integer] : TIntItem read GetItem; default;
end;

function TIntList .Add(Value1, Value2 : Integer): Integer;
var
 p : PIntItem;
begin
 New(p);
 p^.Item1 := Value1;
 p^.Item2 := Value2;
 Result := inherited Add(p);
end;

procedure TIntList .Clear;
var
 i : Integer;
 p : Pointer;
begin
 for i:=0 to Count-1 do
 begin
   p := Get(i);
   Dispose(PIntItem(p));
 end;
 inherited;
end;

function TIntList.GetItem(Index: Integer): TIntItem;
begin
 Result := PIntItem(Get(Index))^;
end;

procedure TIntList.Notify(Ptr: Pointer; Action: TListNotification);
begin
 inherited;
 if Action in [lnExtracted, lnDeleted] then
   Dispose(PIntItem(Ptr));
end;


← →
JB2   (2009-04-07 12:04) [4]


> Ega23 ©   (07.04.09 11:22) [3]


Что-то не так в методе Notify. У меня при добавлении записи вылетает exception Invalid Pointer operation.


← →
Ega23 ©   (2009-04-07 12:44) [5]


> Что-то не так в методе Notify. У меня при добавлении записи
> вылетает exception Invalid Pointer operation.


У меня нормально всё. Вот с Clear я действительно намудрил, он перекрытый тут вроде как не нужен...



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.007 c
2-1239114286
микола
2009-04-07 18:24
2009.05.24
делфи и єксель


15-1237529834
Int23
2009-03-20 09:17
2009.05.24
Теоретический вопрос про разработку языков программирования


2-1239200285
NormaN
2009-04-08 18:18
2009.05.24
Как создать копию файла *.mdb с выбранными записями?


15-1237492883
MsGuns
2009-03-19 23:01
2009.05.24
Два украинских ФК в 1/4 финала КУЕФА


2-1239093371
Анфиса
2009-04-07 12:36
2009.05.24
Excel в Delphi




   Наверх