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

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

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

Ответить
Azazaz
новенький
Сообщения: 41
Зарегистрирован: 21.04.2015 19:00:03

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

Сообщение Azazaz »

Вот код, запустите и посмотрите на последнее выводимое значение:

Код: Выделить всё

{$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.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Возможно когданибудь в досе так работало. Сейчас нет, освобождай столько сколько выделил, не указывая размера.

Код: Выделить всё

PToMem:= GetMem(sizeof(...));
...
FreeMem(PToMem);
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

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