![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректно освободить память [D5]
harisma © (2012-02-02 15:13:00)Есть некий класс. В нем есть 2 внутренних поля типа TStringList (FNameLst: TStringList; FClassNameLst: TStringList)
В процессе работы в этот класс добавляются некие объекты (не важно какие) при помощи следующего метода этого класса:
function TRegItem.AddItem(ItemClass: TRegItemClass; ItemName: AnsiString): TRegItem;
var
L: TList;
begin
L := GetList(ItemClass.ClassName, True);
Result := ItemClass.Create(ItemName);
L.Add(Result);
FNameLst.AddObject(ItemName, Result);
end;
function TRegItem.GetList(const ItemClassName: AnsiString; DoCreate: Boolean): TList;
var
Idx: Integer;
begin
if (FClassNameLst = nil) then
Result := nil
else
if FClassNameLst.Find(ItemClassName, Idx) then
Result := TList(FClassNameLst.Objects[Idx])
else
if DoCreate then
begin
Result := TList.Create;
FClassNameLst.AddObject(ItemClassName, Result)
end
else
Result := nil;
end;
Разрушение выполняется таким методом:
procedure TRegItem.ClearItems;
var
I: Integer;
procedure LClearList(Lst: TList);
var
I: Integer;
begin
for I := Lst.Count - 1 downto 0 do
TObject(Lst[I]).Free;
Lst.Clear;
end;
begin
if (FNameLst <> nil) then
FNameLst.Clear;
if (FClassNameLst <> nil) then
begin
for i := 0 to FClassNameLst.Count - 1 do
begin
LClearList(TList(FClassNameLst.Objects[I]));
FClassNameLst.Objects[I].Free;
end;
FClassNameLst.Clear;
end;
end;
Только что-то мне сдается, что такое освобождение не освобождает эти объекты полностью. Подскажите, где тут ошибка?
Юрий_ (2012-02-02 18:23:00) [1]FastMM при соответствующих настройках показывает все достаточно подробно - в том числе классы забытых объектов, и место, где они были созданы.
А вместо TList можно использовать TObjectList, чтобы он сам разрушал свои элементы, и не пришлось делать это руками
~AQUARIUS~ (2012-02-02 17:28:00) [2]Вы нигде не уничтожаете обьекты в FNameLst.Objects (надо делать аналогично как с FClassNameLst.Objects, а не просто очищать итемы FNameLst.Clear). В логику вьехать трудно, поэтому подробнее смотрите сами. По сути надо удалить все те обьекты, которые в методе AddItem добавляются на строке L.Add(Result);
harisma (2012-02-02 16:11:00) [3]
> Возьми FastMM и проверь, есть ли утечка.
Как раз этим FastMM я и вижу, что она есть. Только как правильно освобождать эту память в этом конкретном случае?
Омлет (2012-02-02 15:35:00) [4]Возьми FastMM и проверь, есть ли утечка.