Re[5]: Подходы с присвоением больших сложных массивов
От: rudzuk  
Дата: 11.09.23 17:15
Оценка:
Здравствуйте, Khimik, Вы писали:

K> R>Ты принципиально ничего не читаешь, или как?


K> R>Умные указатели:

K> R>Как правило, основной целью задействования умных указателей является инкапсуляция работы с динамической памятью таким образом, чтобы свойства и поведение умных указателей имитировали свойства и поведение обычных указателей. При этом на них возлагается обязанность своевременного и аккуратного высвобождения выделенных ресурсов, что упрощает разработку кода и процесс отладки, исключая утечки памяти и возникновение висячих ссылок[2].

K> Утечки памяти — это понятно. Сейчас я отловил все утечки в своей программе, работаю с включенным ReportMemoryLeaksOnShutdown, поэтому такой проблему у меня нет. А что такое висячие ссылки?


Да он издевается!
avalon/3.0.2
Re[6]: Подходы с присвоением больших сложных массивов
От: Khimik  
Дата: 11.09.23 17:23
Оценка:
Здравствуйте, rudzuk, Вы писали:

K>> Утечки памяти — это понятно. Сейчас я отловил все утечки в своей программе, работаю с включенным ReportMemoryLeaksOnShutdown, поэтому такой проблему у меня нет. А что такое висячие ссылки?


R>Да он издевается!


А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[7]: Подходы с присвоением больших сложных массивов
От: rudzuk  
Дата: 11.09.23 17:55
Оценка:
Здравствуйте, Khimik, Вы писали:

K> А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?


Нет, насколько мне известно. Есть хорошая штука — слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)
avalon/3.0.2
Re[7]: Подходы с присвоением больших сложных массивов
От: swame  
Дата: 11.09.23 18:52
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, rudzuk, Вы писали:


K>>> Утечки памяти — это понятно. Сейчас я отловил все утечки в своей программе, работаю с включенным ReportMemoryLeaksOnShutdown, поэтому такой проблему у меня нет. А что такое висячие ссылки?


R>>Да он издевается!


K>А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?



Штатных способов продиагностировать обращения к висящим указателям нет.
Как продиагностировать обращения к висящим указателм я писал тебе про диагностику с помощью FastMM.
Как я надежно избегаю обращения к висящим указателям я писал тебе в этой теме.

Есть модификатор для слабых ссылок [weak].
https://habr.com/ru/articles/282035/
Я этим способом не пользуюсь, так как свой способ использовал до появления этого модификатора.
Также у мнея нет уверенности насколько это хорошо будет работать под капотом при большом количестве ссылок,
как у меня — до десятком миллионов, по производительности и памяти. Как — нибудь протестирую, может перейду на них.
Отредактировано 11.09.2023 19:36 swame . Предыдущая версия . Еще …
Отредактировано 11.09.2023 19:04 swame . Предыдущая версия .
Отредактировано 11.09.2023 19:03 swame . Предыдущая версия .
Re[3]: Подходы с присвоением больших сложных массивов
От: Khimik  
Дата: 11.09.23 19:27
Оценка:
Здравствуйте, 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]: Подходы с присвоением больших сложных массивов
От: swame  
Дата: 11.09.23 19:35
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, Khimik, Вы писали:


K>> А в Delphi можно настроить отлов висящих указателей? Что-то вроде range checking или ReportMemoryLeaksOnShutdown тут помогают?


R>слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)


В свежих дельфях — не только для интерфейсов.
Re[4]: Подходы с присвоением больших сложных массивов
От: swame  
Дата: 11.09.23 19:41
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


K> Сорри, не очень пока понимаю как это работает. А в чём разница, если дестроить объекты не через xxx.free, а через это:


Тут ты обнуляешь только одну конкретную переменную-указатель.
А на один и тот же объект могут ссылаться много указателей из разных мест.
Здесь обнулится только один указатель, в остальных переменных останется указетель на мусор.

K>..

K>freeobject(xxx);
K>[/code]
Отредактировано 11.09.2023 19:42 swame . Предыдущая версия .
Re[6]: Подходы с присвоением больших сложных массивов
От: swame  
Дата: 11.09.23 20:09
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, swame, Вы писали:



s>> Ксавье пачеко у меня были от 2 или 3 Delphi.


R>Отлично. Только динамические массивы появились в Delphi 4. Вот ссылка на Пачеко. Переходишь на 95 страницу и читаешь.


Да, согласен, удивился что так поздно. Чем же мы до того пользовались? Видимо VarArray.
Re[9]: Подходы с присвоением больших сложных массивов
От: rudzuk  
Дата: 11.09.23 20:25
Оценка:
Здравствуйте, swame, Вы писали:

s> R>слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)


s> В свежих дельфях — не только для интерфейсов.


Только.
avalon/3.0.2
Re[10]: Подходы с присвоением больших сложных массивов
От: swame  
Дата: 12.09.23 10:23
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, swame, Вы писали:


s>> R>слабые ссылки, но работают только для интерфейсов и только начиная с Delphi 10.1 (если не учитывать платформы с поддержкой ARC, от которого все равно отказались)


s>> В свежих дельфях — не только для интерфейсов.


R>Только.

  TField = class(TComponent)
  private
    FAutoGenerateValue: TAutoRefreshFlag;
    [Weak]FDataSet: TDataSet;
    FFieldName: string;
    [Weak]FFields: TFields;
    FDataType: TFieldType;
    FReadOnly: Boolean;
    FFieldKind: TFieldKind;
    FAlignment: TAlignment;
    FVisible: Boolean;
    FRequired: Boolean;
    FValidating: Boolean;
    FSize: Integer;
    FOffset: Integer;
    FFieldNo: Integer;
    FDisplayWidth: Integer;
    FDisplayLabel: string;
    FEditMask: TEditMask;
    FValueBuffer: TValueBuffer;
{$IFNDEF NEXTGEN}
    FValueBufferPtr: Pointer;
{$ENDIF !NEXTGEN}
    [Weak]FLookupDataSet: TDataSet;
    FKeyFields: string;
    FLookupKeyFields: string;
    FLookupResultField: string;
    FLookupCache: Boolean;
    FLookupList: TLookupList;
    FAttributeSet: string;
    FCustomConstraint: string;
    FImportedConstraint: string;
    FConstraintErrorMessage: string;
    FDefaultExpression: string;
    FOrigin: string;
    FProviderFlags: TProviderFlags;
    [Weak]FParentField: TObjectField;
    FValidChars: TFieldChars;
Re[11]: Подходы с присвоением больших сложных массивов
От: rudzuk  
Дата: 12.09.23 13:13
Оценка:
Здравствуйте, swame, Вы писали:

s> s>> В свежих дельфях — не только для интерфейсов.


s> R>Только.


s>
s>   TField = class(TComponent)
s>   private
s>     FAutoGenerateValue: TAutoRefreshFlag;
s>     [Weak]FDataSet: TDataSet;
s>     FFieldName: string;
s>     [Weak]FFields: TFields;
s>     FDataType: TFieldType;
s>     FReadOnly: Boolean;
s>     FFieldKind: TFieldKind;
s>     FAlignment: TAlignment;
s>     FVisible: Boolean;
s>     FRequired: Boolean;
s>     FValidating: Boolean;
s>     FSize: Integer;
s>     FOffset: Integer;
s>     FFieldNo: Integer;
s>     FDisplayWidth: Integer;
s>     FDisplayLabel: string;
s>     FEditMask: TEditMask;
s>     FValueBuffer: TValueBuffer;
s> {$IFNDEF NEXTGEN}
s>     FValueBufferPtr: Pointer;
s> {$ENDIF !NEXTGEN}
s>     [Weak]FLookupDataSet: TDataSet;
s>     FKeyFields: string;
s>     FLookupKeyFields: string;
s>     FLookupResultField: string;
s>     FLookupCache: Boolean;
s>     FLookupList: TLookupList;
s>     FAttributeSet: string;
s>     FCustomConstraint: string;
s>     FImportedConstraint: string;
s>     FConstraintErrorMessage: string;
s>     FDefaultExpression: string;
s>     FOrigin: string;
s>     FProviderFlags: TProviderFlags;
s>     [Weak]FParentField: TObjectField;
s>     FValidChars: TFieldChars;
s>


Что ты хочешь мне сказать? Что в VCL осталось говно с тех времен, когда они болели ARC'ом?
avalon/3.0.2
Re: Подходы с присвоением больших сложных массивов
От: Khimik  
Дата: 13.09.23 10:05
Оценка:
Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)?
Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[2]: Подходы с присвоением больших сложных массивов
От: Doom100500 Израиль  
Дата: 13.09.23 10:11
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)?

K>Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.

https://www.delphipower.xyz/handbook_2009/smart_pointers_in_delphi.html
Спасибо за внимание
Re[3]: Подходы с присвоением больших сложных массивов
От: Khimik  
Дата: 13.09.23 10:22
Оценка:
Здравствуйте, 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]: Подходы с присвоением больших сложных массивов
От: Khimik  
Дата: 13.09.23 12:02
Оценка:
Здравствуйте, Doom100500, Вы писали:

K>>Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)?

K>>Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.

D>https://www.delphipower.xyz/handbook_2009/smart_pointers_in_delphi.html


Тут на этой странице изложено что-то очень простое, как объявить класс в процедуре/функции, чтобы он автоматически создавался и освобождался, как рекорд. И это всё? Или умные указатели это ещё что-то?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Отредактировано 13.09.2023 12:03 Khimik . Предыдущая версия .
Re[4]: Подходы с присвоением больших сложных массивов
От: Doom100500 Израиль  
Дата: 13.09.23 12:11
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, Doom100500, Вы писали:


K>>>Прошу прощения, вот читаю сейчас тему в КСВ и осознаю, что по-прежнему не понимаю, что такое умные указатели. Если их делать самостоятельно, может кто-нибудь поделиться примером кода (Delphi)?

K>>>Или умные указатели можно реализовать в Delphi через некий TCustomUniquePtr? Мне это слово подсказал GPT3.

D>>https://www.delphipower.xyz/handbook_2009/smart_pointers_in_delphi.html


K>Тут на этой странице изложено что-то очень простое, как объявить класс в процедуре/функции, чтобы он автоматически создавался и освобождался, как рекорд. И это всё? Или умные указатели это ещё что-то?


Да, умные указатели — это про автоматическое управление временем жизни объекта, на который он указывает. В зависимости от целей могут быть с подсчёт ссылок или без.
Не знаю, ка в делфи, но в плюсах умные указатели мимикрируют под обычные (голые) указатели.
Спасибо за внимание
Re[3]: Подходы с присвоением больших сложных массивов
От: Кодт Россия  
Дата: 13.09.23 15:05
Оценка:
Здравствуйте, Khimik, Вы писали:

K> С умными указателями я ещё не освоился. Колхозить мне проще, чем изучать чьи-то готовые решения.


Колхозить лучше с оглядкой на готовые решения, чтоб не ходить по граблям.

K> Повторяю вопрос который неявно сформулировал: правильно ли я понимаю, что основная цель умных указателей — экономия ресурсов? Т.е. если ресурсов хватает, можно всё просто копировать.


В ООП есть два вида сущностей: объекты (изменяемые, и обладающие свойством идентичности) и значения (неизменяемые, и обладающие свойством эквивалентности).

Значения можно копировать, а разделяемое владение — это, действительно, экономия. Потому что очевидно, что из идентичности следует эквивалентность (один и тот же экземпляр равен самому себе).
А copy on write — это техника экономной работы с переменными значениями (переменная обладает свойством объекта, а её содержимое — свойством значения).
Если значение принадлежит только одной переменной, то константность можно безболезненно нарушать.
Если же экземпляр значения разделяется между несколькими переменными, то перед изменением содержимого одной переменной значение нужно клонировать.

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

Умные указатели одинаково хорошо пригождаются и в первом, и во втором случае: и со значениями, и с объектами.
Больше того, некоторые языки (питон) используют умные указатели для автоматического управления памятью.
Перекуём баги на фичи!
Re: Подходы с присвоением больших сложных массивов
От: Khimik  
Дата: 14.09.23 09:41
Оценка: :))
Я сейчас перевожу сторонний код с C++ на Delphi (чужая программа для научных расчётов), и невыносимо иметь дело с указателями. Вообще, я за 20 лет работы над своим проектом определился, что терпеть не могу указатели, всякие malloc, realloc и т.д. Это легко становится источником ошибок. Например в их коде указатель используется чтобы пробежать по массиву, а надо использовать обычный динамический массив и пробегать по нему индексом. Местные сишники с этим согласятся?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.