IPB
ЛогинПароль:

> Утечка памяти
klem4
сообщение 20.08.2006 18:56
Сообщение #1


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Ухх что-то мозг уже не варит, куда память пропадает ?

Поменял New/Dispose на GetMem/FreeMem не помогло.

{$mode objfpc}

uses crt;

type

  TData = integer;

  PList = ^TList;

  TList = record
    data : TData;
    next : PList;
  end;

  TStack = object

    public

      constructor Init;
      destructor  Done;

      procedure Push(item : TData);
      function  Pop : TData;

    private

      First, Last : PList;
  end;

constructor TStack.Init;
begin
  First := nil;
  Last  := nil;
end;

destructor TStack.Done;
begin
  FreeMem(First, sizeof(TList));
  FreeMem(Last, sizeof(TList));
end;

procedure TStack.Push(item : TData);
var
  temp : PList;
begin

  GetMem(temp, sizeof(TList));

  temp^.data := item;
  temp^.next := nil;

  if First = nil then begin
    First := temp;
    Last  := temp;
  end else begin
    Last^.next := temp;
    Last := temp;
  end;
end;

function TStack.Pop : TData;
var
  temp : PList;
begin

  if First = nil then begin
    writeln('nil');
    exit;
  end;

  new(temp);

  temp := First;

  result := First^.Data;
  First  := First^.Next;

  FreeMem(temp, sizeof(TList)); // ===================> ТУТ память не освобождается :(
end;

var

  s : TStack;

begin
  clrscr;

  writeln('Free Before = ', GetHeapStatus.TotalFree);

  s.Init;

  s.Push(3);
  s.Push(12);
  s.Push(4);

  s.Pop;
  s.Pop;
  s.Pop;

  s.Done;

  writeln('Free After  = ', GetHeapStatus.TotalFree);

  readln;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 20.08.2006 22:07
Сообщение #2


Гость






Так... Уже ближе.

Следующий шаг: почему бы TList не сделать объектом? У меня вот что получилось:
{$mode objfpc}
uses crt;

type
  TData = integer;

  PList = ^TList;
  TList = object

  public
    data: TData;
    next: PList;

    constructor init(X: TData);
  end;

  TStack = object

  public
    constructor Init;
    destructor  Done;

    procedure Push(item : TData);
    function  Pop : TData;

  private
    First, Last : PList;
  end;

constructor tlist.init(X: TData);
begin
  Data := X; next := nil;
end;

constructor TStack.Init;
begin
  First := nil;
  Last  := nil;
end;

destructor TStack.Done;
var
  temp : PList;
begin
  while (First <> nil) do begin
    temp := First;
    First := First^.Next;
    dispose(temp);
  end;
end;

procedure TStack.Push(item : TData);
var
  temp : PList;
begin
  temp := new(PList, init(item));

  if First = nil then First := temp
  else Last^.next := temp;

  Last := temp;
end;

function TStack.Pop : TData;
var
  temp : PList;
begin

  if First = nil then begin
    writeln('nil');
    exit;
  end;

  temp := First;

  result := First^.Data;
  First  := First^.Next;

  dispose(temp);
end;

var
  s : TStack;

begin
  clrscr;
  writeln('Free Before = ', GetHeapStatus.TotalFree);

  s.Init;

  s.Push(3);
  s.Push(12);
  s.Push(4);

  s.Pop;
  s.Pop;
  s.Pop;

  s.Done;

  writeln('Free After  = ', GetHeapStatus.TotalFree);
  readln;
end.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 7.08.2025 5:16
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"