Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.24;
Скачать: 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 вся ветка

Текущий архив: 2009.05.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
2-1239177864
JB2
2009-04-08 12:04
2009.05.24
Строку в список


2-1239550339
Новичок
2009-04-12 19:32
2009.05.24
Помогите обратиться к параметрам FilterOptions


2-1239140033
istok
2009-04-08 01:33
2009.05.24
D2009: PAnsiChar to AnsiString


2-1239624079
Dimon_
2009-04-13 16:01
2009.05.24
Распечатка html документа


15-1237388584
StriderMan
2009-03-18 18:03
2009.05.24
Контроль версий БД