Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКорректно освободить память Найти похожие ветки
← →
harisma © (2012-02-02 15:13) [0]Есть некий класс. В нем есть 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 15:35) [1]Возьми FastMM и проверь, есть ли утечка.
← →
harisma © (2012-02-02 16:11) [2]
> Возьми FastMM и проверь, есть ли утечка.
Как раз этим FastMM я и вижу, что она есть. Только как правильно освобождать эту память в этом конкретном случае?
← →
~AQUARIUS~ (2012-02-02 17:28) [3]Вы нигде не уничтожаете обьекты в FNameLst.Objects (надо делать аналогично как с FClassNameLst.Objects, а не просто очищать итемы FNameLst.Clear). В логику вьехать трудно, поэтому подробнее смотрите сами. По сути надо удалить все те обьекты, которые в методе AddItem добавляются на строке L.Add(Result);
← →
Юрий_ (2012-02-02 18:23) [4]FastMM при соответствующих настройках показывает все достаточно подробно - в том числе классы забытых объектов, и место, где они были созданы.
А вместо TList можно использовать TObjectList, чтобы он сам разрушал свои элементы, и не пришлось делать это руками
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.076 c