Правильный free

Проектирование и разработка идеального средства программирования.

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

Re: Правильный free

Сообщение Vadim » 17.12.2018 08:55:28

DedFrend писал(а):Ну а зачем же я пример программы приводил?

Я не знаю... Вы ведь результат работы программы не привели... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Правильный free

Сообщение serbod » 17.12.2018 11:36:54

DedFrend писал(а):почему НЕЛЬЗЯ ОБНУЛИТЬ SELF ПРИ ВЫЗОВЕ ДЕСТРУКТОРА?

Потому что при правильном использовании классов в этом нет никакой необходимости. После уничтожения экземпляра класса, занимаемая им память в "куче" возвращается системе. И дальше забота системы, что с этой памятью делать - обнулить, выдать другой программе или оставить "на потом" на случай, если некорректно написанная программа продолжить эту память использовать (как было в win95).

Для ленивых и невнимательных программистов есть много готовых решений - от менеджеров памяти (FastMM и его аналоги с проверками утечек памяти и обращения по "мертвым" указателям) до поддержки подсчета ссылок и классов-контейнеров с механизмом извещений.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Правильный free

Сообщение olegy123 » 17.12.2018 13:42:11

Vadim писал(а):А действительно, не потрудится ли топикстартер рассказать, что он имеет в виду...
потому что, си/паскаль создавались еще тогда когда даже менеджеров памяти не было, удел программиста создать данные поработать с ними и за собой убрать.
Если вы копируете объекты.. то копируете не сам физический объект - а его ссылку, номер памяти в котором что то находится. копирование - это копирование просто номера SimpleRef := SimpleInt;. Этот номер можете поделить, умножить сложить..
Когда делаете SimpleInt.free запускает деструктор который нужен для программиста чтобы ручками мог подчистить данные.. а можно и не скидывать.. но если данные создавались динамически - то легко получить утечку памяти

что делает SimpleRef.Value? - по коду берет из номера памяти со смещением на Value значение.
..

Добавлено спустя 7 минут 59 секунд:
DedFrend писал(а):Уточняю постановку вопроса: Кто-нибудь понимает, почему НЕЛЬЗЯ ОБНУЛИТЬ SELF ПРИ ВЫЗОВЕ ДЕСТРУКТОРА?
потому что лень..
В курсе что простым динамическим созданием/удалением в линухе программа может скушать всю память, только потому что менеджеру памяти линуха лень дефрагментировать. Создатели посчитали, что эта операция очень затратная по времени.
Поэтому self обнулять после деструктора - лишние операции на старых компах с 3Мгц считалось роскошью.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Правильный free

Сообщение Лекс Айрин » 17.12.2018 17:59:09

DedFrend писал(а):Но все классы являются потомками TObject и я не понимаю почему нельзя разрушить (хотя бы self обнулить) сам объект, а не только ссылку на него. Причем сделать это абсолютно прозрачно, не требуя от программиста дополнительной работы.


Потому что размер объекта величина не постоянная и может меняться в процессе выполнения программы. И никто не гарантирует, что удастся корректно удалить весь объект. Конечно, можно отслеживать все выделения/освобождения памяти, но это очень сильно замедляет программу. Поэтому это дело отдано на откуп программисту. Ну а контроль всех ссылок на одно и тоже место (и их удаление при освобождении объекта/переменной) может вообще порушить программу, если эти данные зачем-то нужны программисту.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Правильный free

Сообщение zub » 17.12.2018 21:30:49

>>Потому что размер объекта величина не постоянная и может меняться в процессе выполнения программы. И никто не гарантирует, что удастся корректно удалить весь объект.
трэд фантазий
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Правильный free

Сообщение Лекс Айрин » 17.12.2018 21:39:07

zub, не мой, а автора одного из учебников по TP. Кажется, по 7 версии. Там было, в том числе, что-то связанное с присваиванием родителя предку или наоборот...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Правильный free

Сообщение zub » 17.12.2018 22:10:04

Не важно чем вызваны фантазии, то что это фантазии не отменяется.
Читаем посты Дож на первой странице и переименовываем топик, т.к. то что хочет автор это никак правильным не является.

Выделил ТС память. распихал ее адрес по десяти разным указателям. потом развыделил... и хочет чтобы во всех указателях nil по волшебной палочке появился?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Правильный free

Сообщение Лекс Айрин » 17.12.2018 22:50:04

zub, это сразу понятно, что он хочет странного. Лень очень этому способствует.

zub писал(а):Не важно чем вызваны фантазии, то что это фантазии не отменяется.


Просто учту на будущее.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Правильный free

Сообщение Vapaamies » 18.12.2018 05:36:38

Поскольку тема в разделе «Компилятор / язык программирования», позволю себе немного попиариться. 8)

Реализация умных указателей (smart pointers), о которых говорит DedFrend, планируется в Халва-Паскале. Он будет компилировать при помощи платформы Кантора, в которой будет автоматическое управление памятью на основе графов достижимости, — функционально аналогичное Rust, но сделанное проще, по-паскалевски. Пока непонятно, какие именно техники будут использованы в Канторе и какие входные данные потребуются при компиляции в Кантор из Паскаля, поэтому об исключении Free и FreeAndNil сходу заявить не могу. Если же удастся сделать как хочется, в халвовом синтаксисе Паскаля Dispose, Free и FreeAndNil наверняка будут запрещены, а память и ссылки станут отслеживаться неявно.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Правильный free

Сообщение Лекс Айрин » 18.12.2018 07:35:12

Vapaamies, а как же возможность получить кусок памяти и делать с ним все, что возможно?

Добавлено спустя 4 минуты 53 секунды:
Кроме того, тогда о какой совместимости с ObjectPascal идет речь?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Правильный free

Сообщение Cheb » 18.12.2018 15:35:09

Кто-нибудь понимает, почему НЕЛЬЗЯ ОБНУЛИТЬ SELF ПРИ ВЫЗОВЕ ДЕСТРУКТОРА?
И я имею в виду не программиста, а разработчиков.

Потому что Self - это локальная переменная деструктора (или любого метода) - фактически переданная ему ссылка на экземпляр класса.
Внутри экземпляра класса Self нет. Self - в стеке или в регистре, как оптимизатор прописал. Время жизни - до возврата из метода.
Обнуляя его ты лишь стреляешь себе в ногу, ничего более.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Правильный free

Сообщение Vapaamies » 18.12.2018 20:05:07

Лекс Айрин писал(а):Vapaamies, а как же возможность получить кусок памяти и делать с ним все, что возможно?

«Всё, что возможно» укладывается в 2 пункта:
  • Манипуляции над массивами/строками через адресную арифметику.
  • Передача адресов во внешние API (ОС, библиотеки).

Манипуляции над массивами и строками предполагается анализировать эвристически и превращать в выражения объектной алгебры. На переходный период будет также небезопасное расширение стандарных классов, допускающее адресную арифметику.

Передача во внешние API остается без изменений, будет лишь конструкция handle by для объявления финализатора типа:
Код: Выделить всё
public class HGLOBAL from :Core:LongWord handle by GlobalFree;

Пример кода — уже на Канторе. Как он ляжет в Халва-Паскаль и ляжет ли вообще, вопрос пока открытый.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Правильный free

Сообщение Лекс Айрин » 18.12.2018 20:51:58

Vapaamies писал(а):«Всё, что возможно» укладывается в 2 пункта:


Не забудь еще, что надо сообщить компилятору, что память уже не нужна. Это процедура Dispose.
Потом, я могу в этом блоке памяти разместить тупо блоб, который динамически изменять, осуществляя доступ к его частям по смещению относительно базового. Примером такого блоба можно считать исполняемый файл, который собирается компилятором.
Vapaamies писал(а):Передача во внешние API остается без изменений, будет лишь конструкция handle by для объявления финализатора

И что это дает? Финализацию, в fpc, можно тупо сделать в каждом модуле и в программе забыть об этом.
Кстати, ты уж определись туда или обратно... Либо ты придерживаешься спецификации Object Pascal, либо Канторовской. Вместе как-то не получается. Будет гибрид слона и кита.

Vapaamies писал(а):На переходный период будет также небезопасное расширение стандарных классов, допускающее адресную арифметику.


А вот это, имхо, совсем зря. Классы создавались чтобы убрать все, в идеале, манипуляции с адресами от пользователя. Т, е, это уход от адресной арифметики. (пусть если что меня zub поправит).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Правильный free

Сообщение DedFrend » 18.12.2018 22:21:29

Всем спасибо за обсуждение.
В общем-то я боялся, что ломлюсь в открытую дверь. Оказывается дверь действительно существует.
Но я не прощаюсь! Скоро я по этой проблематике еще новую тему создам.
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: Правильный free

Сообщение Vadim » 19.12.2018 03:18:12

DedFrend писал(а):Скоро я по этой проблематике еще новую тему создам.

Пока что проблему следует признать недостаточно аргументированой и обоснованой. Учтите это при создание новой темы... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Пред.

Вернуться в Компилятор / язык программирования

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

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

Рейтинг@Mail.ru