Главная страница
    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.088 c
2-1170160295
dmdel
2007-01-30 15:31
2007.02.18
Перекинуть данные из таблицы в другую


15-1169917017
Ученик чародея
2007-01-27 19:56
2007.02.18
Кто такой программист?


2-1170424258
Garacio
2007-02-02 16:50
2007.02.18
Текущая дата в формате dd.mm.yy


15-1169679314
hmmmmmmmm
2007-01-25 01:55
2007.02.18
плата клика adSense


2-1169983925
SerJaNT
2007-01-28 14:32
2007.02.18
Проиграть звук





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский