Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Вниз

Утечка памяти в delphi   Найти похожие ветки 

 
dmitry   (2005-05-21 21:14) [0]

Привет всем! Немогу понять почему происходит утечка памяти и утечка памяти ли это вообще... Подскажите плиз...
Есть функция GetFileList которая возвращяет список файлов в директории...
Она вызывается по таймеру и следит тем самым что содержание директории изменилось...
Если посмотреть в списке процессов то видно что память занимаемая процессом постоянно растёт... Если закоментировать строку вызывающюю функцию то размер программы увеличивать перестаёт...

Подскажите почему это может происходить? И вообще когда делфи уничтожает екземпляры класса? После выхода из функции? И что происходит в строке запуска функции, происходит копирование или DncList просто получает адресс уже созданного екземпляра класса и где про ето почитать... Заранее спасибо за ответы...

Вызываеться таким образом (лишнее я выкинул):
procedure TFormShablon.TimerTestFolderTimer(Sender: TObject);
var  DncList:TStringList;

begin
    DncList:=GetFileList("c:\123","*.*");
end;

Сама функция:
Function GetFileList(dir:string="";mask:string="*.*";attr:integer=faAnyFile):TStringList;
var res:cardinal;s:tsearchrec;
begin
 result:=TStringList.Create;
 if dir="" then dir:=GetCurrentDir;
 res:=FindFirst(dir+"/"+mask,attr,s);
 while res=0 do begin
   result.Append(s.Name);
   res:=FindNext(s);
 end;
end;


 
Anatoly Podgoretsky ©   (2005-05-21 21:20) [1]

И чего с каждым чихом таймера создается новый TStringList, да еще и и процедура поиска не освобождает ресурсы в системе. Тебе насколько часов ресурсов компьютера хватает? А дальше как?


 
dmitry   (2005-05-21 21:33) [2]

Дак и яж про что... Даже если изменить процедуру как указано ниже всёравно нечего не меняеться как это исправить?

procedure TFormShablon.TimerTestFolderTimer(Sender: TObject);
var  DncList:TStringList;

begin
   DncList:=GetFileList("c:\123","*.*");
   DncList.Destroy;
end;


 
begin...end ©   (2005-05-21 21:44) [3]

> dmitry   (21.05.05 21:14)

О причинах роста занимаемой памяти сказали в [1]. Каждый раз при вызове функции GetFileList создаётся экземпляр класса TStringList: result:=TStringList.Create, и, вероятно, после этого он нигде не освобождается.

Можно сделать так: создавать экземпляр один раз вне функции, и потом каждый раз передавать ссылку на него в подпрограмму:

procedure GetFileList(List: TStringList; ...);
var
 ...
begin
 List.Clear;
 { Далее -- весь прежний код функции, только без result:=TStringList.Create
   и с заменой result.Append на List.Append }
 ...
end;


Затем создаём экземпляр один раз в нужном месте программы:

var
 DncList: TStringList;
begin
 DncList := TStringList.Create
end


и по таймеру вызываем подпрограмму:

GetFileList(DncList, ...)

Когда DncList станет ненужным, его можно будет уничтожить (тоже толкьо один раз):

DncList.Free.

Ну и ещё: определять наличие изменений в каталоге, вызывая что-то по таймеру, несколько нерационально. Для этого есть API-функции.

> dmitry   (21.05.05 21:33) [2]

Добавьте в функцию вызов FindClose.


 
Anatoly Podgoretsky ©   (2005-05-21 21:55) [4]

begin
  DncList.Free;
  DncList:=GetFileList("c:\123","*.*");
end;


 
dmitry   (2005-05-21 22:27) [5]

Огромное спасибо... Виноват был FindClose, после того как я его добавил DncList.Free начала нормально удалять экземпляр класса... Вот только я так и не понял какое это имеет отношение друг к другу как думаете?


 
Anatoly Podgoretsky ©   (2005-05-21 22:36) [6]

Никакого, это два независимых источника утечек.


 
Anatoly Podgoretsky ©   (2005-05-21 22:38) [7]

Поскольку код не приведен, то наверно есть еще куча утечек. Кроме того смущает такое ассинхронное удаление списка, это тоже явная потенциальная проблема.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.011 c
1-1116858567
Karlson
2005-05-23 18:29
2005.06.06
Результат NaN


14-1116485447
Алексей
2005-05-19 10:50
2005.06.06
Неразрешимая для меня проблема


8-1109018204
Eraser
2005-02-21 23:36
2005.06.06
16 или 15 битный Bitmap и обращение к компонентам RGB


6-1111521808
DEMON XXX
2005-03-22 23:03
2005.06.06
Как вставить сохранённую HTML страницу в форму вDelphi?


10-1093613582
Reflex
2004-08-27 17:33
2005.06.06
вопрос по OleAutomation





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