Главная страница
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.147 c
1-1300622372
Gu
2011-03-20 14:59
2013.03.22
Ресурсы x64 Dll


2-1339501345
ostryak5
2012-06-12 15:42
2013.03.22
Помогите решить задачу, пожалуйста.


15-1346099401
Юрий
2012-08-28 00:30
2013.03.22
С днем рождения ! 28 августа 2012 вторник


1-1295644073
Wadimka
2011-01-22 00:07
2013.03.22
Конвертация даты в миллисекундах в TDateTime


2-1338196726
leklerk
2012-05-28 13:18
2013.03.22
Не работает WinExec