Ссылается ли указатель на компонент?

Вопросы программирования и использования среды Lazarus.

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

Re: Ссылается ли указатель на компонент?

Сообщение stanilar » 27.08.2016 02:35:48

zub писал(а):не поможет даже супер-пупер менеджер памяти


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

Мне просто интересно, может у ТС кроме проблемы забытого фри, есть другие идеи использования isValidObjInst?
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 27.08.2016 04:23:42

stanilar писал(а):Потому что память с забытым к удалению объектом, можно определить только по тому, что на эту память нет ссылок в программе.

В принципе можно производить "сборку мусора" по завершению скрипта.
Скрипт выполнился - все оъекты созданные скриптом освобождаются... можно сделать исключение для "експортируемых" объектов. (если например они нужны на момент выполнения следующего скрипта)

stanilar писал(а):Мне просто интересно, может у ТС кроме проблемы забытого фри, есть другие идеи использования isValidObjInst?

у ТС, как он много раз объяснял проблемы определения правильный ли указатель или нет.
Идея в целом очень здравая, т.к. он не хочет, чтобы кривонаписанный скрипт обрушил всё приложение.
А вот средства достижения не очень.
Во первых isValidObjInst опираясь на средства "по-умолчанию" написать надёжным неполучиться. Потому что память в куче, распредляется без дополнительной информации о том "для чего эта память". Тупо нехватает данных. Всегда можно нарваться на кусок памяти, который похож на объект но объектом не является.
Во-вторых, isValidObjInst можно написать надёжно, используя, например свой Memony-manager. НО, и даже проверив правильность указателя, и зная что он "да указывает на объект", всё-равно в итоге будет очень ненадёжная система.
Об этом писал зуб.
Сценарий таков:
Код: Выделить всё
// это скриптовый код
b := CreateButton;
ComponentDelete(b);
... что ещё...
ComponentDelete(b);

к моменту ComponentDelete память могла перераспределиться, и по указателю "b" может лежать вполне правильный объект. isValidObjInst вполне правильно вернёт ему "true". Но этот объект может быть внутренним для программы (скриптового движка). А значит вызывать ему TObject(b).Free (что делает ComponentDelete) опасно.
Это больше уже не техническая проблема, а логическая.
isValidObjInst - не должен возвращать правильный ли там инстанс объекта, а он должен возвращать "лежит ли по указателю объект, который вообще-то доступен скрипту".
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение stanilar » 27.08.2016 16:28:18

скалогрыз писал(а):можно производить "сборку мусора" по завершению скрипта.

Для этого не нужна функция isValidObjInst.

Вот это:
скалогрыз писал(а): "лежит ли по указателю объект, который вообще-то доступен скрипту"

И вот это:
скалогрыз писал(а): он много раз объяснял проблемы определения правильный ли указатель или нет


Лишено смысла, если скриптовый движок не следит за существованием переменных, по типу интерфейсов в дельфи. Вот мне и интересно посмотреть на тестовый код, который и покажет мне всю необходимость isValidObjInst за место использования IInterface.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Ссылается ли указатель на компонент?

Сообщение Лекс Айрин » 27.08.2016 17:27:40

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


Некоторые тут с распальцовкой уверяют, что не лишено, а мы все тут типа лохи и ни хрена не понимаем... где-то так-с.

stanilar писал(а):который и покажет мне всю необходимость isValidObjInst за место использования IInterface.


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

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 29.08.2016 02:46:19

stanilar писал(а):Лишено смысла, если скриптовый движок не следит за существованием переменных, по типу интерфейсов в дельфи. Вот мне и интересно посмотреть на тестовый код, который и покажет мне всю необходимость isValidObjInst за место использования IInterface.

ТС хочет и рыбку съесть и косточкой не подавиться, и при этом не делать каких-либо дополнительных телодвижений.

Использование интерфейсов в простейшем случае, лишь одной из вариацией хендлов.
В сложном случае, будут использоваться напрямую, но их функционал должен быть заложен в скриптовый язык (вроде присвоения интерфейса переменной увеличивает его счётчик). Как уж их применять.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение zub » 30.08.2016 14:31:16

deleted
Упс. вру((
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Ссылается ли указатель на компонент?

Сообщение and » 01.09.2016 20:52:39

2jakyro:
У Вас пробел в рассуждениях. Логическая дырка, если угодно.
Да, IsValid(testPtr)=false надёжно показывает, что testPtr не указывает на валидный объект. Эти "хаки" (игры с VMT) хорошо известны ещё со времён Delphi 1*.
Однако IsValid(testPtr)=true НЕ показывает, что testPtr указывает на валидный объект. Как его "доработать"? Правильный ответ дан в одном из первых постов: никак. От слова "совсем". Просто примите это как данность. Такая возможность не заложена в языке, не заложена в компиляторе. "Волшебную функцию" Вам не назвали не потому, что она малоизвестна. Её нет. Не потому нет, что никто не потрудился оформить пару (или пару десятков, или сотен etc) строк кода в виде функции. И не потому, что она прожорлива к ресурсам. Она просто невозможна в терминах языка (Паскаль) и реализации (FPC). Ни функция/процедура, ни даже magik какой-нибудь хитрый. Почему, Вы думаете, компоненты связаны между собой всяческими нотификациями? Зачем нужны были бы эти заморочки, если б можно было надёжно и корректно установить факт (не)валидности объекта?
Для решения задачи строго в озвученной постановке Вам, как неоднократно говорили выше, нужен другой инструмент с другой идеологией (managed). Если настаиваете на FPC (или Delphi) реализации - потрудитесь всё-таки переформулировать задачу. (Ну или, действительно, остановитесь на том, что Вы "нашли решение". Работает только в некоторых случаях? Ну, так ведь "работает" же >:-E ).
----------
*Почему, в таком случае, о них не пишут на каждом заборе? Именно потому, что большинство программеров прекрасно осознают написанное выше - кто интуитивно, кто потому что в школе хорошо учился. И считают непрофессиональным выдавать на-гора ненадёжный код, а тем паче поощрять распространение порочных практик написания такого кода. Мечтаете быть говнокодером? Попробуйте задать свой вопрос на каком-нибудь индусском (я не о национальной принадлежности) форуме. ПолУчите там ответ, отличающийся от здешнего.

P.S. И да, в Delphi Ваш валидатор тоже не работал. Что бы там Вам ни казалось. Любой грамотно составленный test case бы это показал. Очевидно, Вы просто весьма слабо осведомлены о методологии тестирования. В противном случае не ставили бы знак равенства между "я не столкнулся с ошибкой" и "не содержит ошибок".
Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru