Главная страница
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.48 MB
Время: 0.008 c
15-1237372534
It's not me
2009-03-18 13:35
2009.05.24
Re-raise исключений


3-1221048997
Drowsy
2008-09-10 16:16
2009.05.24
Как в ХП передать вводимую строку из DBGrid-а?


2-1239343514
Гость
2009-04-10 10:05
2009.05.24
Работа с потоками.


3-1221466747
pushkin42
2008-09-15 12:19
2009.05.24
Обратный запрос


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