Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Утечка памяти при использовании 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]


> я сомневаюсь, что они освободили занятую ранее память. Освободили
> или нет?


Не сомневайся, освободили.


> размер программы в оперативной памяти разрастается


Как разрастается, так и уменьшается.

Управление оперативной памятью - привелегия ОС. Когда захочет - загрузит, когда захочет - выгрузит.


Наверх

Титульная страница Поиск, карта сайта Написать письмо