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

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

Сервис ест память [D6, Win2k]


Sergey V. Shadrin ©   (2002-08-27 07:35:00) 

написал сервис, который просматривает каталог, в случае наличия там определенных файлов переносит их в другой и делает соответствующие записи в dbf. все работает. только при старте он занимал 4 мега, за ночь вырос до 6,300 мегов. все динамические массивы закрываю (finalize(name)). в чем может быть причина?


lmatveev   (2002-08-29 02:29:00) [1]

Ошибка точно в list:=tstringlist.Create
Для каждого созданого списка обязательно надо делать Free, а здесь этого нет. Как правильно написал MBo ©, надо заранее создавать список, передавать в процедур, а потом уничтожать:

procedure StartScan(StartDir: string; Mask:string);
var
list: TStringList;
begin
list := TStringList.Create;
try
ScanDir(StartDir, Mask, list);
finally
list.free;
end;
end;

procedure ScanDir(StartDir: string; Mask:string; var list:TStringlist);
var SR : TSearchRec;
begin
//list:=tstringlist.Create;
with list do
begin
if FindFirst(startdir+mask, 47, sr) = 0 then
begin
repeat
if (sr.Attr and 47) = sr.Attr
then list.add(sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
end;


Ну или подобным образом...


ЮЮ   (2002-08-27 09:40:00) [2]

Ну что ж, не буду верить Helpy, а буду - Anatoly Podgoretsky :-)


Anatoly Podgoretsky   (2002-08-27 09:30:00) [3]

ЮЮ © (27.08.02 09:12)
Если не найдется не одного файла то ресурсы выделены не будути естественно освобождать ничего не надо, а в зависимости от версии Дельфи и опасно.


MBo   (2002-08-27 09:21:00) [4]

лучше сделать процедуру так -
procedure ScanDir(StartDir: string; Mask:string; list:TStrings);

не создавать в ней tstringlist, а передавать уже имеющийся список (TStringList, созданный вовне или, например, Memo.Lines)
Тогда будет полный контроль за его созданием и уничтожением.
А текущий код может привести к тому, что при каждом вызове процедуры создается НОВЫЙ список, а ссылка на старый теряется, что и приводит к утечке.


Sergey V. Shadrin   (2002-08-27 09:19:00) [5]

так-то не всегда. очень много циклов в холостую. но при этом не сильно растет. самый большой рост наблюдается сразу после запуска, при первом выполнении переноса. с 3,600 кб до 5,100 кб


ЮЮ   (2002-08-27 09:12:00) [6]

У тебя FindClose(sr), только если найдётся ходь один файл по маске, а он всегда есть ? Правда точно такой же код приведён и в Helpe, хотя там же написано:
Note: FindFirst allocates resources (memory) which must be released by calling FindClose.


Sergey V. Shadrin   (2002-08-27 09:03:00) [7]

procedure ScanDir(StartDir: string; Mask:string; var list:TStringlist);
var SR : TSearchRec;
begin
list:=tstringlist.Create;
with list do
begin
if FindFirst(startdir+mask, 47, sr) = 0 then
begin
repeat
if (sr.Attr and 47) = sr.Attr
then list.add(sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
end;


ЮЮ   (2002-08-27 08:54:00) [8]

А для каждого FindFirst делаешь FindClose?


MBo   (2002-08-27 08:50:00) [9]

>Sergey V. Shadrin
это настораживает ;)
давно уже код просили


Sergey V. Shadrin   (2002-08-27 08:49:00) [10]

делалось все Tlist.add(string)


Anatoly Podgoretsky   (2002-08-27 08:47:00) [11]

Мы не телепаты, телепаты не мы.


MBo   (2002-08-27 08:33:00) [12]

Sergey V. Shadrin
нет
на что указывают List[i]?
как выделялась под это память?
надо выполнить обратную операцию


Sergey V. Shadrin   (2002-08-27 08:30:00) [13]

2MBo) т.е. надо дать
for i:=0 to tlist.count-1 do
tlist.strings[i].free

так?


Alx2   (2002-08-27 08:28:00) [14]

>Sergey V. Shadrin (27.08.02 08:19)
А "то,что в tlist содержится"?


MBo   (2002-08-27 08:26:00) [15]

это не освобождает данные, на которые указывают содержащиеся в TList пойнтеры, надо руками каждый элемент dispose или free, в зависимости от содержания


Sergey V. Shadrin   (2002-08-27 08:19:00) [16]

Да. ему дается команда Tlist.free


MBo   (2002-08-27 08:17:00) [17]

а очищается то,что в tlist содержится?


Sergey V. Shadrin   (2002-08-27 08:11:00) [18]

погу послать исходники.


Sergey V. Shadrin   (2002-08-27 08:10:00) [19]

используется: Tlist (free на него сделано), 3 динамических массива (все финализированы), несколько раз открываются dbf таблицы и закрываются. строковые и целые переменные


Viktor Kushnir   (2002-08-27 08:05:00) [20]

Надо втдеть, что ты там еще используешь. Мы же не телепаты.


Наверх

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