![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечки памяти в TShellComboBox [D7, WinXP]
Serega41 © (2006-08-24 21:09:00)Подключил давече FastMM4 к своему проекту, содержащему TShellComboBox, который лежит в $(DELPHI)\Demos\...\ShellControls и обнаружил там утечки памяти:
37 - 44 bytes: TShellFolder x 10
45 - 60 bytes: TStringList x 10
может кто-нибудь из присутствующих знает где можно найти подправленный ShellCtrls.pas?
Serega41 (2006-08-31 17:09:00) [1]Спасибо за подсказки!)
Решил таким образом:
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;
atruhin (2006-08-30 13:01:00) [2]> вообще, этот FastMM как-то странно определяет. в моём DarkEyeProxy
> II
Давно пользуюсь и всегда определяет идеально. Иногда по долгу искал, но всегда находил утечки.
Кстати, кто не знает, очень удобно использовать, показывает, дамп не освобожденной памяти, класс для которго распределена, если использовался New, Create, стек вызова функции распределивший блок, строку в исходном коде.
Rouse_ (2006-08-30 12:56:00) [3]
> Можно поинтересоваться, а с помощью какой программы это
> установлено (утечка памяти)?
В 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;
Serega41 (2006-08-30 11:21:00) [4]Не в TStringList, а он сам не освобождается (тем классом, который его создал)
REA (2006-08-30 11:03:00) [5]Сомневаюсь, что в TStringList что то не освобождается.
Serega41 (2006-08-29 23:25:00) [6]Ну там, похоже, действительно TShellFolder и TStringList не освобождаются, а копаться в исходниках очень лень)
Думал, может кто-то уже покопался и подправил...)
PSPF2003 (2006-08-24 21:36:00) [7]
> Ketmar
:) Понял пасибо
Ketmar (2006-08-24 21:32:00) [8]вообще, этот FastMM как-то странно определяет. в моём DarkEyeProxy II он тоже при выходе показывает утечку. всегда одного и того же размера. сильно подозреваю, что и тут такое же. это не утечка, это он не отловил финализацию чего-то (или оная не делается в силу ненужности).
Ketmar (2006-08-24 21:30:00) [9]FastMM4. %-)
PSPF2003 (2006-08-24 21:11:00) [10]Можно поинтересоваться, а с помощью какой программы это установлено (утечка памяти)?