Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: 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 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.12 c
15-1331817337
QWERTY_
2012-03-15 17:15
2013.03.22
thumbnails


15-1330604387
upc
2012-03-01 16:19
2013.03.22
Покупка Delphi


15-1333015766
Сергей М.
2012-03-29 14:09
2013.03.22
SMS и IMEI


15-1346911110
AV
2012-09-06 09:58
2013.03.22
Программистом я б пошел.. Пусть меня научат!


15-1331479236
Sergey Masloff
2012-03-11 19:20
2013.03.22
Пишу из горящего танка. Накрылся HDD. Кто виноват и что делать