Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.068 c
2-1170056377
Kotofeich
2007-01-29 10:39
2007.02.18
запуск броузера


2-1169820865
Destroyer
2007-01-26 17:14
2007.02.18
Утечка памяти при использовании TStrings


15-1169718111
Ericc
2007-01-25 12:41
2007.02.18
ОФФ:На этом сайте была игрушка "Гробница фараона"


15-1170072129
Ученик чародея
2007-01-29 15:02
2007.02.18
Какое количество ошибок в программе можно считать нормальным?


15-1169649184
Vlad Oshin
2007-01-24 17:33
2007.02.18
web программирование на delphi..даже не знаю как называется это





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский