![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сервис ест память [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]Надо втдеть, что ты там еще используешь. Мы же не телепаты.