Size: a a a

2020 April 24

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
Удаление объектов штука коварная. Лучше их не удалять, а ставить пометку, что он удален и не отображать в списках. Потому что наверняка после удаления где-то останется ссылка на удаленный объект и произойдет обращение к чужой области памяти. Есть способы с этим бороться, всякие "умные ссылки" и подсчет ссылок. Но самое верное в этом случае это пометка на удаление и "сборка мусора".
Ну, т.е. ты косяки разработки ("наверняка останется где-то ссылка") предлагаешь замаскировать, вводя новые сущности, типа "пометка на удаление", "сборка мусора"?
источник

SB

Sergey Bodrov in Delphi & Lazarus
Alexey Shumkin
Ну, т.е. ты косяки разработки ("наверняка останется где-то ссылка") предлагаешь замаскировать, вводя новые сущности, типа "пометка на удаление", "сборка мусора"?
А есть способы лучше?
источник

SB

Sergey Bodrov in Delphi & Lazarus
Знаю еще более надежный способ - иммутабельность. =) Когда при любой операции делается копия данных и никаких ссылок.
источник

AS

Alexey Shumkin in Delphi & Lazarus
Sergey Bodrov
А есть способы лучше?
Ты сам их упомянул :)
"__всякие "умные ссылки" и подсчет ссылок"__

Все хают джаву за сборку мусора, а ты в делфи предлагаешь сделать ненавистные паскалистам механизмы ...
источник

AS

Alexey Shumkin in Delphi & Lazarus
Но у джавы других механизмов нет - ей-то можно простить.. но в Паскале...
источник

СД

Сергей Дятлов in Delphi & Lazarus
А есть что нибудь попроще умных ссылок?
источник

SB

Sergey Bodrov in Delphi & Lazarus
Сергей Дятлов
А есть что нибудь попроще умных ссылок?
Хендлы. Вместо ссылки на объект использовать индекс объекта в списке. Выше описано для "простых" списков.
источник

AI

Alexander Ivanov in Delphi & Lazarus
ICMSmartPointer<T: class> = reference to function: T;

 /// <summary>
 ///   Данный тип нужен для деинициализации указателей и классов
 ///   Пример использования в SmartPointers
 /// </summary>
 TCMSmartPointer<T: class> = class(TInterfacedObject, ICMSmartPointer<T>)
 strict private
   FObject: T;
   function Invoke: T; inline;
 public
   constructor Create(AObject: T);
   destructor Destroy; override;
 end;
источник

AI

Alexander Ivanov in Delphi & Lazarus
{ TCMSmartPointer<T> }

constructor TCMSmartPointer<T>.Create(AObject: T);
begin
 FObject := AObject;
end;

destructor TCMSmartPointer<T>.Destroy;
begin
 FreeAndNil(FObject);
 inherited Destroy;
end;

function TCMSmartPointer<T>.Invoke: T;
begin
 Result := FObject;
end;
источник

SB

Sergey Bodrov in Delphi & Lazarus
Тогда получается один экземпляр объекта на всю программу, который лежит в глобальном списке. И даже если его удалить, ничего плохого не произойдет, индекс будет недействительным или там будет другой объект, а это не так больно как попасть в пальцем в стену.
источник

AI

Alexander Ivanov in Delphi & Lazarus
Sergey Bodrov
Тогда получается один экземпляр объекта на всю программу, который лежит в глобальном списке. И даже если его удалить, ничего плохого не произойдет, индекс будет недействительным или там будет другой объект, а это не так больно как попасть в пальцем в стену.
Зачем так вообще городить.
источник

AI

Alexander Ivanov in Delphi & Lazarus
Выше код можно любой класс сделать управляемым.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Alexander Ivanov
Выше код можно любой класс сделать управляемым.
У меня тоже есть модуль для "умных ссылок", без женериков - https://github.com/serbod/NovaLib/blob/master/WeakRefs.pas
источник

AI

Alexander Ivanov in Delphi & Lazarus
С дженериками удобнее.
источник

DB

Dmitry Belkevich in Delphi & Lazarus
что-то мне кажется что вы слегка усложняете
источник

AS

Alexey Shumkin in Delphi & Lazarus
Dmitry Belkevich
что-то мне кажется что вы слегка усложняете
сказал Дмитрий, который придумал свой GC ))))))))))))))
источник

DB

Dmitry Belkevich in Delphi & Lazarus
у меня случай сложнее :)
источник

DB

Dmitry Belkevich in Delphi & Lazarus
Я уже описывал что и как. но могу повторить - не вопрос
источник

DB

Dmitry Belkevich in Delphi & Lazarus
в прошлый раз ничего лучше не предложили насколько помню
источник

СД

Сергей Дятлов in Delphi & Lazarus
Повтори плиз
источник