Форум: "Основная";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
ВнизСервис ест память Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c