Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c