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

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Утечка памяти
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #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

 





- Текстовая версия 29.03.2024 17:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name