Менеджер памяти: баг или фича?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Менеджер памяти: баг или фича?

Сообщение Azazaz » 07.08.2016 11:20:04

Вот код, запустите и посмотрите на последнее выводимое значение:
Код: Выделить всё
{$mode objfpc}{$H+}

function Test: PWord;
begin
Result:= GetMem(4);      {2 слова}
PDWord(Result)^:= 0;     {обнуляем оба}
Writeln(PWord(Result)^, ' ', PWord(Result + 2)^); {содержимое слов}
Freemem(Result, 2);           {удаляем первое слово}
inc(Result);                  {переходим ко второму}
Writeln(PWord(Result)^, '!'); {должен быть ноль}
readln;
FreeMem(Result, 2);
readln;
end;

begin
Test;
end.

Получаю всегда не 0 значение. Это баг?
Версия компилятора 3.0.0.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Менеджер памяти: баг или фича?

Сообщение zub » 07.08.2016 12:26:21

Возможно когданибудь в досе так работало. Сейчас нет, освобождай столько сколько выделил, не указывая размера.
Код: Выделить всё
PToMem:= GetMem(sizeof(...));
...
FreeMem(PToMem);
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Менеджер памяти: баг или фича?

Сообщение runewalsh » 07.08.2016 12:34:42

Нельзя освободить часть блока, только весь, по тому же указателю, что вернула GetMem. После FreeMem старое значение указателя становится не валидным и больше с ним ничего делать нельзя. В версии FreeMem с размером ты обязан передать тот же размер, что выделял (поэтому её никто не использует), это может быть полезным (нет), если вдруг в своём менеджере ты решил это ОПТИМИЗИРОВАТЬ и не запоминать размеры блоков.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33

Рейтинг@Mail.ru