![Компьютерный форум OSzone.net](images/oszone.net.print.gif) |
|
Pascal-функция, которая возвращает указатель-нет ли утечки?
Есть такие типы данных:
Код:
type
Plane=record
name: string[20];
manfac: string[20];
lengs: integer;
height: integer;
wingsL: integer;
wingsS: integer;
end;
PPlane=^Plane;
TFile = File of Plane;
и несколько функций:
Код:
{reads data from keyboard and returns completed Plane Record}
function EnterItem:PPlane;
var
ptmp:PPlane;
begin
New(ptmp);
writeln('Enter name of plane(string, 20 chars):');
readln(ptmp^.name);
writeln('Enter manufactor of plane(string, 20 chars):');
readln(ptmp^.manfac);
writeln('Enter length of plane(integer):');
readln(ptmp^.lengs);
writeln('Enter heigth of plane(integer):');
readln(ptmp^.height);
writeln('Enter length of wings(integer):');
readln(ptmp^.wingsL);
writeln('Enter square of wings(integer):');
readln(ptmp^.wingsS);
EnterItem:=ptmp;
end;
{adds N items to end of main file(f)}
procedure NToEnd (n:integer;var f:TFile);
var
i:integer;
begin
RESET(f);
seek(f,filesize(f));
for i:=1 to n do
begin
writeln('Entering item number:',i);
write(f,EnterItem^);
end;
writeln('Entering finished!');
CLOSE(f);
end;
и вопрос: не будет ли утечки памяти при такой реализации, будут ли экземпляры Plane удалятся с памяти после использования? Такая реализация возникла при создании функции которая должна возвратить собственный тип, чего Турбо Паскаль не позволяет...
|
Сам же сразу отвечаю на свой вопрос:будет. Нужно вызывать функцию Dispose(p: Pointer).
|
Вот тестовый пример, который показывает данную ситуацию:
Код:
program qwerty;
type
Myarr=array[1..10] of real;
PMyarr=^Myarr;
var
p:PMyarr;
i:integer;
function retp:PMyarr;
var
retval:PMyarr;
begin
New(retval);
retp:=retval;
end;
begin
i:=0;
while true do
begin
p:=retp;
{Dispose(p);}
i:=i+1;
writeln(i)
end
end.
Вылетает с ошибкой на 8447 итерации цикла. Раскоментировав строку {Dispose(p);} бесконечно работающий цикл.
|
Время: 20:14.
© OSzone.net 2001-