![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с освобождением памяти [D5, Win2k]
Duncan © (2004-06-16 15:23:00)Я создаю список, через некоторое время кидаю его в БД и освобождаю. Но в результате оперативка тает на глазах и не освобождается. Освобождается она только после завершения программы, но т.к. мне нужен сервис, то соответственно постоянно оперативка пожирается при попытке обработать очередной файл. Вот структура и процедура уничтожения списка:
//По горизонтали идет идут данные PTIP_B, для каждого из которого в низ идут данные типа PTIP_A.
type Traf=record
IP_A, IP_B:longword;
ASN_A, ASN_B, INT_A, INT_B:word;
BYTES_A, BYTES_B: longword;
DT: TDateTime;
end;
PTIP_A=^TIP_A;
TIP_A=record
down:PTIP_A;
IP_A:longword;
INT_A, int_B, ASN_A, ASN_B:word;
BYTES_A, BYTES_B: longword;
DT: TDateTime;
end;
PTIP_B=^TIP_B;
TIP_B=record
next:PTIP_B;
down:PTIP_A;
IP_B:longword;
end;
procedure SaveAndDestroy;
var
i, count:integer;
p,p1:PTIP_B;
a,a1:PTIP_A;
begin
new(p);
wtr.StartTransaction;
for i:=0 to 255 do begin
p:=arrpoint[i];
while (p<>nil) do begin
new(a); a:=p^.down;
while (a<>nil) do begin
with qIns do begin
//Пишем в бд
end;
inc(count);
if count>700 then begin
wtr.Commit; count:=count-700;
wtr.StartTransaction; end;
new(a1); a1:=a;
a:=a^.down; dispose(a1);
end;
dispose(a); new(p1);
p1:=p; p:=p^.next; dispose(p1); end;
arrpoint[i]:=nil; end;
wtr.Commit;
dispose(p);
end;
Sandman25 (2004-06-16 15:26:00) [41]В алгоритме куча ошибок.
Например, зачем new(p), если сразу выполняется p:=arrpoint[i];