Pull to refresh

Comments 19

В XE4 обещают вроде как ARC — контроль количества ссылок на объекты и автоматическое освобождение объекта, когда он более не используется, а также слабые и сильные ссылки.
Да, в новых версиях прогресс заметен. И там подобны хак уже не нужен.
Но в данной задаче я был ограничен 11й версией. Фактически нужно было в уже готовом коде найти проблему с двойным дестроем. Вот именно идеей появившейся при решении этой конкретной задачи я и поделился.
Повторный вызов деструктора вполне себе отлавливает FastMM.
ARC только для iOS будет. ПОкрайней мере в XE4. Вроде как для андроид в будущих версиях планируют. Для десктопа же все очень туманно.
В такие минуты чувствуешь себя слоупоком, оказывается XE4 уже «зарелизили», на ру-борде появилась ссылка буквально пару часов назад.
Простите, но я вообще не понимаю, как можно пытаться вызвать FreeAndNil для строки или числа. В голове не укладывается.
Ну например так. Был TList потом заменили на массив а про FreeAndNil забыли. В общем, не важно как. Важно что в данном случае ничто не защищает от ошибки кроме внимательности программиста.
То есть было var MyObj: TList, а потом сделали Var MyObj: TSomeArray? При такой проблеме согласен, надо какой-то уведомитель, что образовалась нештатная ситуация. Однако, подобное будет видно позже, в профайлере памяти, ведь потечет память, выделенная под массив (ссылка на него станет = nil, а содержимое останется).

Если так, то я решаю проблему проще. У каждой ссылки на объект есть постфикс — что это такое. Например, Var MyList: TList, а потом бы стало Var MyArray: TSomeArray. Рекомендую)
ну у нас переодически абстрактные классы стал интерфейсами становятся. компилятор ничего не говорит, но естественно при вызов FreeAndNil — AV получаем. Так что проблем с этой функцией есть
Да, получается, это — смешанная проблема внимательности разработчика и технологии в целом. ИМХО, надо прокачивать как внимательность, так и технологию; внимательность — в первую очередь.
>>это — смешанная проблема внимательности разработчика и технологии в целом.
ну возможно в 80х годах — это была и смешанная проблема, но в 21 веке — это проблема отсталости технологии. Печалит, что даже в совремнных версиях дельфи я не могу нормальный FreeAndNil написать. Максимум, что можно — TObjectHelper.FreeAndNil [ TMyObject ] (MyObject) // вместо [] — угловые скобки читать
Гораздо проще просто запретить использование freeAndNil.
А проблема висячих ссылок решается использованием:
— объектов передаваемых по значению (record и old-style object) вместо class,
— динамических массивов вместо контейнеров хранящих ссылки на class,
— интерфейсов.
UFO just landed and posted this here
пишу на Python, C# и Java в случае вынужденной самообороны ;) связи с делфевым FreeAndNil не вижу ;) в общем это либо мелкий троллинг либо книжек недочитали ;)
UFO just landed and posted this here
не знаю почему вас заминусовали, может потому, что вы использование интерфейсов не поставили на первой место? ;)
а про остальное не сказали, что это «устаревшие технологии» и при божеской архитектуре все эти извраты ненужны? ;)

а про FreeAndNil могу с вами согласится ;) прекрасно обхожусь без него :)
Да, непонятно за что минусы :)
Я постоянно использую интерфейсы, и в курсе про SIL sourceforge.net/projects/sil/
но для многих DTO интерфейсы — уже больше чем необходимо хотя бы потому что кода больше в разы.
как человек, пишущий 15 лет на Delphi, не смог пройти мимо ;)
поиск решения это похвально, но сама по себе проблема надумана ;)
про FastMM вам уже сказали — он бешено рулит, если мне не изменяет память, с 2004 года… а в 2007-й Delphi так и вообще встроен(вы в курсе? ;) и включается 1-й строкой.
если начать говорить про архитектуру, то можно вспомнить, что разделение ответсвенности — это хорошо ;) и тогда возникает вопрос — а с чего это вы так ресурсами жонглируете что они у вас освоброждаются где попало?
еще можно нетипизированными указателями бросатся из одного конца приложения в другой(попадались такие извращенцы, хотя Delphi сопротивляется этому до последнего), тогда никакой FreeAndNil не поможет…

в общем, использование FreeAndNil в надежде что это избавит от ошибок, вместо корректной архитектуры с разграничением доступа — уже костыль. а вы его «покрасили серебрянкой» ;)

P.S. использую исключительно Free либо интерфесы — полет нормальный :)
Sign up to leave a comment.

Articles