Вниз
Скачать: CL | DM;

Корректно освободить память   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.071 c
3-1285160032
yurikon
2010-09-22 16:53
2013.03.22
Событие по смене записи


15-1328042693
Димка На
2012-02-01 00:44
2013.03.22
Максимальная версия программы (продукта)


15-1346298363
brother
2012-08-30 07:46
2013.03.22
Помогите с алгоритмом


2-1342772214
Scott Storch
2012-07-20 12:16
2013.03.22
Завершить работу приложения


15-1330633805
Юрий
2012-03-02 00:30
2013.03.22
С днем рождения ! 2 марта 2012 пятница




   Наверх