Здравствуйте, Khimik, Вы писали:
K> R>Ты принципиально ничего не читаешь, или как?
K> R>Умные указатели: K> R>Как правило, основной целью задействования умных указателей является инкапсуляция работы с динамической памятью таким образом, чтобы свойства и поведение умных указателей имитировали свойства и поведение обычных указателей. При этом на них возлагается обязанность своевременного и аккуратного высвобождения выделенных ресурсов, что упрощает разработку кода и процесс отладки, исключая утечки памяти и возникновение висячих ссылок[2].
K> Утечки памяти — это понятно. Сейчас я отловил все утечки в своей программе, работаю с включенным ReportMemoryLeaksOnShutdown, поэтому такой проблему у меня нет. А что такое висячие ссылки?
Здравствуйте, rudzuk, Вы писали:
K>> Утечки памяти — это понятно. Сейчас я отловил все утечки в своей программе, работаю с включенным ReportMemoryLeaksOnShutdown, поэтому такой проблему у меня нет. А что такое висячие ссылки?
R>Да он издевается!
А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[7]: Подходы с присвоением больших сложных массивов
Здравствуйте, Khimik, Вы писали:
K> А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?
Нет, насколько мне известно. Есть хорошая штука — слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, rudzuk, Вы писали:
K>>> Утечки памяти — это понятно. Сейчас я отловил все утечки в своей программе, работаю с включенным ReportMemoryLeaksOnShutdown, поэтому такой проблему у меня нет. А что такое висячие ссылки?
R>>Да он издевается!
K>А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?
Штатных способов продиагностировать обращения к висящим указателям нет.
Как продиагностировать обращения к висящим указателм я писал тебе про диагностику с помощью FastMM.
Как я надежно избегаю обращения к висящим указателям я писал тебе в этой теме.
Есть модификатор для слабых ссылок [weak]. https://habr.com/ru/articles/282035/
Я этим способом не пользуюсь, так как свой способ использовал до появления этого модификатора.
Также у мнея нет уверенности насколько это хорошо будет работать под капотом при большом количестве ссылок,
как у меня — до десятком миллионов, по производительности и памяти. Как — нибудь протестирую, может перейду на них.
Здравствуйте, swame, Вы писали:
A>>Но в такой системе при изменении структуры "все данные" ссылки могут потерять актуальность и привести к SegFault. A>>Поэтому я храню не ссылки, а индексы в массиве. Индекс можно хотя бы проверить перед использованием.
S>Для исключения ссылок на сдестроенные объекты я регистрирую объекты в коллекции TDictionary<int64, TObject> S>Объяетам назначаются идентификаторы int64, при создание объекта он регистрирует себя в коллекции, при дестрое удаляется оттуда. S>в ссылках между объектами хранятся не указатели, а эти идентификаторы. S>Массив не годится там где объекты постоянно создаются — удаляются
Сорри, не очень пока понимаю как это работает. А в чём разница, если дестроить объекты не через xxx.free, а через это:
procedure FreeObject(var obj:pointer);
begin
tobject(obj).Free;
obj:=nil;
end;
..
freeobject(xxx);
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[8]: Подходы с присвоением больших сложных массивов
Здравствуйте, rudzuk, Вы писали:
R>Здравствуйте, Khimik, Вы писали:
K>> А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?
R>слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)
В свежих дельфях — не только для интерфейсов.
Re[4]: Подходы с присвоением больших сложных массивов
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, swame, Вы писали:
K> Сорри, не очень пока понимаю как это работает. А в чём разница, если дестроить объекты не через xxx.free, а через это:
Тут ты обнуляешь только одну конкретную переменную-указатель.
А на один и тот же объект могут ссылаться много указателей из разных мест.
Здесь обнулится только один указатель, в остальных переменных останется указетель на мусор.
K>.. K>freeobject(xxx); K>[/code]
Здравствуйте, rudzuk, Вы писали:
R>Здравствуйте, swame, Вы писали:
s>> Ксавье пачеко у меня были от 2 или 3 Delphi.
R>Отлично. Только динамические массивы появились в Delphi 4. Вот ссылка на Пачеко. Переходишь на 95 страницу и читаешь.
Да, согласен, удивился что так поздно. Чем же мы до того пользовались? Видимо VarArray.
Re[9]: Подходы с присвоением больших сложных массивов
Здравствуйте, swame, Вы писали:
s> R>слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)
s> В свежих дельфях — не только для интерфейсов.
Здравствуйте, rudzuk, Вы писали:
R>Здравствуйте, swame, Вы писали:
s>> R>слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)
s>> В свежих дельфях — не только для интерфейсов.
R>Только.
Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)?
Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[2]: Подходы с присвоением больших сложных массивов
Здравствуйте, Khimik, Вы писали:
K>Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)? K>Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.
Здравствуйте, Doom100500, Вы писали:
K>>Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)? K>>Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.
D>https://www.delphipower.xyz/handbook_2009/smart_pointers_in_delphi.html
Вроде Delphi XE8 не знает что такое TSmartPointer, как и TCustomUniquePtr. Это появилось в более поздних версиях Delphi?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Подходы с присвоением больших сложных массивов
Здравствуйте, Doom100500, Вы писали:
K>>Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)? K>>Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.
D>https://www.delphipower.xyz/handbook_2009/smart_pointers_in_delphi.html
Тут на этой странице изложено что-то очень простое, как объявить класс в процедуре/функции, чтобы он автоматически создавался и освобождался, как рекорд. И это всё? Или умные указатели это ещё что-то?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Здравствуйте, Doom100500, Вы писали:
K>>>Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)? K>>>Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.
D>>https://www.delphipower.xyz/handbook_2009/smart_pointers_in_delphi.html
K>Тут на этой странице изложено что-то очень простое, как объявить класс в процедуре/функции, чтобы он автоматически создавался и освобождался, как рекорд. И это всё? Или умные указатели это ещё что-то?
Да, умные указатели — это про автоматическое управление временем жизни объекта, на который он указывает. В зависимости от целей могут быть с подсчёт ссылок или без.
Не знаю, ка в делфи, но в плюсах умные указатели мимикрируют под обычные (голые) указатели.
Спасибо за внимание
Re[3]: Подходы с присвоением больших сложных массивов
Здравствуйте, Khimik, Вы писали:
K> С умными указателями я ещё не освоился. Колхозить мне проще, чем изучать чьи-то готовые решения.
Колхозить лучше с оглядкой на готовые решения, чтоб не ходить по граблям.
K> Повторяю вопрос который неявно сформулировал: правильно ли я понимаю, что основная цель умных указателей — экономия ресурсов? Т.е. если ресурсов хватает, можно всё просто копировать.
В ООП есть два вида сущностей: объекты (изменяемые, и обладающие свойством идентичности) и значения (неизменяемые, и обладающие свойством эквивалентности).
Значения можно копировать, а разделяемое владение — это, действительно, экономия. Потому что очевидно, что из идентичности следует эквивалентность (один и тот же экземпляр равен самому себе).
А copy on write — это техника экономной работы с переменными значениями (переменная обладает свойством объекта, а её содержимое — свойством значения).
Если значение принадлежит только одной переменной, то константность можно безболезненно нарушать.
Если же экземпляр значения разделяется между несколькими переменными, то перед изменением содержимого одной переменной значение нужно клонировать.
С объектами другая история. Там нужно следить за временем жизни. Пока на объект есть действующие указатели, объект должен жить.
Это обеспечивается
— или ручным управлением памятью (когда граф связей объектов хорошо известен, — например, все объекты однотипные, а структура связей регулярная: двусвязные списки, деревья, и т.п.)
— или умными указателями с подсчётом ссылок (и у этого подхода есть минусы: больший расход памяти на счётчики, дополнительные действия на каждое копирование указателя, а также проблема кольцевых ссылок и бесконечного времени жизни)
— или автоматическим управлением (когда рантайм знает про все объекты и все указатели и следит за связностью графа и за появлением объектов-сирот). Это требует поддержки на уровне языка, либо же определённой избыточной писанины и чистоты рук программиста — эмуляции того, чем занимался бы компилятор и виртуальная машина.
Умные указатели одинаково хорошо пригождаются и в первом, и во втором случае: и со значениями, и с объектами.
Больше того, некоторые языки (питон) используют умные указатели для автоматического управления памятью.
Перекуём баги на фичи!
Re: Подходы с присвоением больших сложных массивов
Я сейчас перевожу сторонний код с C++ на Delphi (чужая программа для научных расчётов), и невыносимо иметь дело с указателями. Вообще, я за 20 лет работы над своим проектом определился, что терпеть не могу указатели, всякие malloc, realloc и т.д. Это легко становится источником ошибок. Например в их коде указатель используется чтобы пробежать по массиву, а надо использовать обычный динамический массив и пробегать по нему индексом. Местные сишники с этим согласятся?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.