Утечка памяти в программе

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

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

Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Иван прав: оператор ничем не отличается от обычной функции, кроме синтаксиса.
В зависимости от платформы и типа результата он (результат) может возвращаться в скрытом параметре, который действительно будет куда-то указывать. Тем не менее, это не var, а out параметр, его значение на входе в функцию не определено.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Sergei I. Gorelkin
А почему такой странный порядок освобождения по счетчику ссылок? viewtopic.php?f=1&t=6753&st=0&sk=t&sd=a#p50621
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Временные переменные управляемых типов освобождаются в блоке try..finally, чтобы не было утечек в случае исключения. Этот блок один на всю процедуру. Кроме того, компилятор вырабатывает некоторый избыток (по сравнению с Дельфи) временных переменных, которые иногда держат ссылки до выхода из процедуры.
Да, это не так, как в Дельфи, и по этому поводу периодически возникает много флейма...
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Ну, судя по результатам, при вычислении следующего выражения временные переменные предыдущего тоже освобождаются... А вот когда подходящего выражения нет, остаются до конца процедуры. Может, есть возможность вызывать какую-нибудь процедуру a-la Collect(), чтобы в явном виде освобождать?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Временные переменные переиспользуются. Т.е. после того, как "старая" становится больше не нужна, новая (если она потребуется) размещается по тому же адресу, при этом старая освобождается. Если новая переменная на это место не требуется, то ссылка остается до конца процедуры.

Возможности освобождать временные переменные в явном виде нет.
Ответить