Смешной баг dispose()

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

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

Ответить
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Смешной баг dispose()

Сообщение runewalsh »

Уже зарепортил, но правда же смешно.

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

{$mode objfpc} {$h+}
function CreateString: pString;
begin
    writeln('Создание строки');
    new(result);
end;

begin
    dispose(CreateString); // печатает «Создание строки» дважды
end.

Ассемблерный листинг выглядит так, будто когда dispose управляемого типа разделяется на Finalize и FreeMem, обе перевычисляют аргумент.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>но правда же смешно
Пока такое ищешь уревешся, а потом, да, смешно
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

интересно да. глюк только для managed type, и их содержащих

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

{$mode objfpc} {$h+}
type
  PRec = ^TRec;
  TRec = record
    s: string; // можно заменить на "array of byte" - глюк останется
               // но если поменять на integer, то работает норм.
  end;
 

function CreateString: PRec;
begin
    writeln('Создание строки');
    new(result);
end;

begin
    dispose(CreateString); // печатает «Создание строки» дважды
end.
Ответить