![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти при использовании TStrings [D7, WinXP]
Destroyer © (2007-01-26 17:14:00)Есть код:
procedure Proc1;
var
DirList : TStrings;
FileList: TStrings;
begin
try
DirList := TStringList.Create;
FileList := TStringList.Create;
...
ScanFolder(DirName,FileList,DirList,...,...);
... // далее проводим операции с FileList,DirList
finally
FileList.Free;
DirList.Free;
end;
procedure ScanFolder (const Root: TFileName; const FileLst, DirLst:TStrings;Ext:string;Param:string);
begin
...
DirLst.Add(Root+'\'+ DirInfo.Name);
...
FileLst.Add(Root+'\'+DirInfo.Name);
...
end;
При большом количестве файлов размер программы в оперативной памяти разрастается, но не уменьшается после выполнения процедур. Видимо, что-то где-то не очищается.
В процедуре ScanFolder - FileLst и DirLst не очишаются, т.к. они являются результатом работы этой процедуры. При следующем обращении к ScanFolder FileLst и DirLst пусты, но я сомневаюсь, что они освободили занятую ранее память. Освободили или нет? Если нет, то как правильно освободить?
Также в Proc1 есть FileList и DirList, они освобождаются (.Free). Такой способ освобождает занятую ими память?
Сергей М. (2007-01-29 12:42:00) [1]Да и нет там, скорей всего, никакой утечки.
Обычный для BMM алгоритм.
Amoeba (2007-01-29 12:01:00) [2]
> Loginov Dmitry © (26.01.07 18:34) [7]
>
> Приведи полный текст процедуры ScanFolder(). Утечка и в
> ней может быть.
>
Факт утечки не установлен.
Palladin (2007-01-28 21:54:00) [3]
> [12] DVM ©
а это уже разврат
DVM (2007-01-28 21:50:00) [4]
> Destroyer © (26.01.07 17:14)
begin
DirList := TStringList.Create;
try
FileList := TStringList.Create;
try
...
finally
FileList.Free;
end;
finally
DirList.Free;
end;
end;
Anatoly Podgoretsky (2007-01-26 21:40:00) [5]
> Так всегда делают :)
Не всегда, иногда включают голову.
Kolan (2007-01-26 21:01:00) [6]
> Ega23 © (26.01.07 17:41) [5]
Так всегда делают :)
evvcom (2007-01-26 19:03:00) [7]> [8] umbra © (26.01.07 18:53)
Значит точно Copy-Paste :)
umbra (2007-01-26 18:53:00) [8]
> Где-то я такое уже видел. Видимо, это Copy-Paste.
это из справки делфи :)
Loginov Dmitry (2007-01-26 18:34:00) [9]Приведи полный текст процедуры ScanFolder(). Утечка и в ней может быть.
evvcom (2007-01-26 18:02:00) [10]> [5] Ega23 © (26.01.07 17:41)
> Неясно, зачем объявлять так...
Где-то я такое уже видел. Видимо, это Copy-Paste.
Ega23 (2007-01-26 17:41:00) [11]
> Строго говоря - не обязательно. Сие зависит от частного
> случая - последующего обращения к методам, специфичным именно
> для стринглиста .. Тады приведение типа не потребуется)
Это понятно. Неясно, зачем объявлять так...
Сергей М. (2007-01-26 17:29:00) [12]
> А так зачем? Объявляй их как TStringList
Строго говоря - не обязательно. Сие зависит от частного случая - последующего обращения к методам, специфичным именно для стринглиста .. Тады приведение типа не потребуется)
Ega23 (2007-01-26 17:25:00) [13]
var
DirList : TStrings;
FileList: TStrings;
DirList := TStringList.Create;
FileList := TStringList.Create;
А так зачем? Объявляй их как TStringList
Вдогонку: создание вынеси из блока try..finally
Сергей М. (2007-01-26 17:24:00) [14]
> try
> DirList := TStringList.Create;
> FileList := TStringList.Create;
> ...
> ScanFolder(DirName,FileList,DirList,...,...);
> ... // далее проводим операции с FileList,DirList
> finally
> FileList.Free;
> DirList.Free;
А вот так делают только чукчи)
Прочие жители Крайнего Севера делают иначе:
ЗанятьРесурс;
try
.. //что-то там
finally
ОсвободитьРесурс;
end;
Сергей М. (2007-01-26 17:19:00) [15]
> я сомневаюсь, что они освободили занятую ранее память. Освободили
> или нет?
Не сомневайся, освободили.
> размер программы в оперативной памяти разрастается
Как разрастается, так и уменьшается.
Управление оперативной памятью - привелегия ОС. Когда захочет - загрузит, когда захочет - выгрузит.