Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.09;
Скачать: CL | DM;

Вниз

Сервис ест память   Найти похожие ветки 

 
Sergey V. Shadrin   (2002-08-27 07:35) [0]

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


 
Viktor Kushnir ©   (2002-08-27 08:05) [1]

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


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

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


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

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


 
MBo ©   (2002-08-27 08:17) [4]

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


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

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


 
MBo ©   (2002-08-27 08:26) [6]

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


 
Alx2 ©   (2002-08-27 08:28) [7]

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


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

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

так?


 
MBo ©   (2002-08-27 08:33) [9]

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


 
Anatoly Podgoretsky ©   (2002-08-27 08:47) [10]

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


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

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


 
MBo ©   (2002-08-27 08:50) [12]

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


 
ЮЮ ©   (2002-08-27 08:54) [13]

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


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

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:12) [15]

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


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

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


 
MBo ©   (2002-08-27 09:21) [17]

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

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


 
Anatoly Podgoretsky ©   (2002-08-27 09:30) [18]

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


 
ЮЮ ©   (2002-08-27 09:40) [19]

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


 
lmatveev   (2002-08-29 02:29) [20]

Ошибка точно в 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;


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



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

Текущий архив: 2002.09.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
7-27242
Alik
2002-06-29 19:37
2002.09.09
Событие OnMouseOver


1-27016
c0pYc@t
2002-08-30 08:57
2002.09.09
Вопрос о реестре


1-27087
Filat
2002-08-28 12:08
2002.09.09
Какой компонент может нарисовать вертикальные линии?


4-27278
wman
2002-07-08 10:33
2002.09.09
Ограничение процессорного времени


14-27156
PVR
2002-08-11 10:14
2002.09.09
Пишем Property Inspector