Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Pascal-функция, которая возвращает указатель-нет ли утечки? (http://forum.oszone.net/showthread.php?t=199316)

crashtuak 12-02-2011 20:34 1611274

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 удалятся с памяти после использования? Такая реализация возникла при создании функции которая должна возвратить собственный тип, чего Турбо Паскаль не позволяет...

crashtuak 12-02-2011 20:35 1611276

Сам же сразу отвечаю на свой вопрос:будет. Нужно вызывать функцию Dispose(p: Pointer).

crashtuak 12-02-2011 20:50 1611290

Вот тестовый пример, который показывает данную ситуацию:
Код:

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.

Время: 20:14.
© OSzone.net 2001-