Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизУтечка памяти при использовании TStrings Найти похожие ветки
← →
Destroyer © (2007-01-26 17:14) [0]Есть код:
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-26 17:19) [1]
> я сомневаюсь, что они освободили занятую ранее память. Освободили
> или нет?
Не сомневайся, освободили.
> размер программы в оперативной памяти разрастается
Как разрастается, так и уменьшается.
Управление оперативной памятью - привелегия ОС. Когда захочет - загрузит, когда захочет - выгрузит.
← →
Сергей М. © (2007-01-26 17:24) [2]
> try
> DirList := TStringList.Create;
> FileList := TStringList.Create;
> ...
> ScanFolder(DirName,FileList,DirList,...,...);
> ... // далее проводим операции с FileList,DirList
> finally
> FileList.Free;
> DirList.Free;
А вот так делают только чукчи)
Прочие жители Крайнего Севера делают иначе:
ЗанятьРесурс;
try
.. //что-то там
finally
ОсвободитьРесурс;
end;
← →
Ega23 © (2007-01-26 17:25) [3]
var
DirList : TStrings;
FileList: TStrings;
DirList := TStringList.Create;
FileList := TStringList.Create;
А так зачем? Объявляй их как TStringList
Вдогонку: создание вынеси из блока try..finally
← →
Сергей М. © (2007-01-26 17:29) [4]
> А так зачем? Объявляй их как TStringList
Строго говоря - не обязательно. Сие зависит от частного случая - последующего обращения к методам, специфичным именно для стринглиста .. Тады приведение типа не потребуется)
← →
Ega23 © (2007-01-26 17:41) [5]
> Строго говоря - не обязательно. Сие зависит от частного
> случая - последующего обращения к методам, специфичным именно
> для стринглиста .. Тады приведение типа не потребуется)
Это понятно. Неясно, зачем объявлять так...
← →
evvcom © (2007-01-26 18:02) [6]> [5] Ega23 © (26.01.07 17:41)
> Неясно, зачем объявлять так...
Где-то я такое уже видел. Видимо, это Copy-Paste.
← →
Loginov Dmitry © (2007-01-26 18:34) [7]Приведи полный текст процедуры ScanFolder(). Утечка и в ней может быть.
← →
umbra © (2007-01-26 18:53) [8]
> Где-то я такое уже видел. Видимо, это Copy-Paste.
это из справки делфи :)
← →
evvcom © (2007-01-26 19:03) [9]> [8] umbra © (26.01.07 18:53)
Значит точно Copy-Paste :)
← →
Kolan © (2007-01-26 21:01) [10]
> Ega23 © (26.01.07 17:41) [5]
Так всегда делают :)
← →
Anatoly Podgoretsky © (2007-01-26 21:40) [11]
> Так всегда делают :)
Не всегда, иногда включают голову.
← →
DVM © (2007-01-28 21:50) [12]
> Destroyer © (26.01.07 17:14)begin
DirList := TStringList.Create;
try
FileList := TStringList.Create;
try
...
finally
FileList.Free;
end;
finally
DirList.Free;
end;
end;
← →
Palladin © (2007-01-28 21:54) [13]
> [12] DVM ©
а это уже разврат
← →
Amoeba © (2007-01-29 12:01) [14]
> Loginov Dmitry © (26.01.07 18:34) [7]
>
> Приведи полный текст процедуры ScanFolder(). Утечка и в
> ней может быть.
>
Факт утечки не установлен.
← →
Сергей М. © (2007-01-29 12:42) [15]Да и нет там, скорей всего, никакой утечки.
Обычный для BMM алгоритм.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.088 c