Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-26940
Юрий73729
2002-08-29 06:58
2002.09.09
Заполнение ImageList иконками


6-27131
Fenix
2002-06-22 09:57
2002.09.09
ip или host


3-26926
Guts
2002-08-19 19:47
2002.09.09
Работа с dbf без bde под Delphi 6


1-27072
zavdim
2002-08-28 11:09
2002.09.09
THTMLViewer


1-26945
Геральт
2002-08-28 22:04
2002.09.09
MainForm





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