Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

Утечки памяти в TShellComboBox   Найти похожие ветки 

 
Serega41 ©   (2006-08-24 21:09) [0]

Подключил давече FastMM4 к своему проекту, содержащему TShellComboBox, который лежит в $(DELPHI)\Demos\...\ShellControls и обнаружил там утечки памяти:
37 - 44 bytes: TShellFolder x 10
45 - 60 bytes: TStringList x 10
может кто-нибудь из присутствующих знает где можно найти подправленный ShellCtrls.pas?


 
PSPF2003 ©   (2006-08-24 21:11) [1]

Можно поинтересоваться, а с помощью какой программы это установлено (утечка памяти)?


 
Ketmar ©   (2006-08-24 21:30) [2]

FastMM4. %-)


 
Ketmar ©   (2006-08-24 21:32) [3]

вообще, этот FastMM как-то странно определяет. в моём DarkEyeProxy II он тоже при выходе показывает утечку. всегда одного и того же размера. сильно подозреваю, что и тут такое же. это не утечка, это он не отловил финализацию чего-то (или оная не делается в силу ненужности).


 
PSPF2003 ©   (2006-08-24 21:36) [4]


> Ketmar

:) Понял пасибо


 
Serega41 ©   (2006-08-29 23:25) [5]

Ну там, похоже, действительно TShellFolder и TStringList не освобождаются, а копаться в исходниках очень лень)
Думал, может кто-то уже покопался и подправил...)


 
REA   (2006-08-30 11:03) [6]

Сомневаюсь, что в TStringList что то не освобождается.


 
Serega41 ©   (2006-08-30 11:21) [7]

Не в TStringList, а он сам не освобождается (тем классом, который его создал)


 
Rouse_ ©   (2006-08-30 12:56) [8]


> Можно поинтересоваться, а с помощью какой программы это
> установлено (утечка памяти)?

В 2006-ой Delphi появился такой флаг: ReportMemoryLeaksOnShutdown. Если его выставить в True, то при завершении будет показываться сколько классов не разрушено и их тип.


> может кто-нибудь из присутствующих знает где можно найти
> подправленный ShellCtrls.pas?


Сделай так:

procedure TCustomShellComboBox.ClearItems;
var
 I: Integer;
begin
 ItemsEx.BeginUpdate;
 try
   for I := 0 to ItemsEx.Count-1 do
   begin
     if Assigned(Folders[i]) then
       Folders[I].Free;
     // ItemsEx[I].Data := nil;
   end;
   // ItemsEx.Clear;
 finally
   ItemsEx.EndUpdate;
 end;    
end;

destructor TCustomShellComboBox.Destroy;
begin
 ClearItems;
 if Assigned(FRootFolder) then FRootFolder.Free;
 inherited Destroy;
 if Assigned(FImageList) then FImageList.Free;
end;


 
atruhin ©   (2006-08-30 13:01) [9]

> вообще, этот FastMM как-то странно определяет. в моём DarkEyeProxy
> II

Давно пользуюсь и всегда определяет идеально. Иногда по долгу искал, но всегда находил утечки.
Кстати, кто не знает, очень удобно использовать, показывает, дамп не освобожденной памяти, класс для которго распределена, если использовался New, Create, стек вызова функции распределивший блок, строку в исходном коде.


 
Serega41 ©   (2006-08-31 17:09) [10]

Спасибо за подсказки!)
Решил таким образом:


procedure TCustomShellComboBox.ClearItems;
var
 I: Integer;
begin
 ItemsEx.BeginUpdate;
 try
   for I := 0 to ItemsEx.Count-1 do
   begin
     if Assigned(Folders[i]) then
       Folders[I].Free;
     if not (csDestroying in ComponentState) then
       ItemsEx[I].Data := nil;
   end;
   ItemsEx.Clear;
 finally
   ItemsEx.EndUpdate;
 end;    
end;

destructor TCustomShellComboBox.Destroy;
begin
 ClearItems;
 if FRootFolder <> nil then
   FRootFolder.Free;
 inherited Destroy;
 if Assigned(FImageList) then FImageList.Free;
end;



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.088 c
15-1158845961
oldman
2006-09-21 17:39
2006.10.15
А вот если Вы все такие умные, почему Вы строем не ходите?


15-1158680769
Marser
2006-09-19 19:46
2006.10.15
Читабельно или красиво - что приоритетнее?


15-1158731090
Интересующийся
2006-09-20 09:44
2006.10.15
Создание плагина для IE or Opera.


15-1158938224
MAster_
2006-09-22 19:17
2006.10.15
Ребята как написать плагин на Total


3-1155506976
Hell's Angel
2006-08-14 02:09
2006.10.15
Заполнение БД(FireBird 1.5)