Информация об изменениях

Сообщение Re[4]: Подходы с присвоением больших сложных массивов от 11.09.2023 19:41

Изменено 11.09.2023 19:42 swame

Re[4]: Подходы с присвоением больших сложных массивов
Здравствуйте, Khimik, Вы писали:

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


A>>>Но в такой системе при изменении структуры "все данные" ссылки могут потерять актуальность и привести к SegFault.

A>>>Поэтому я храню не ссылки, а индексы в массиве. Индекс можно хотя бы проверить перед использованием.

S>>Для исключения ссылок на сдестроенные объекты я регистрирую объекты в коллекции TDictionary<int64, TObject>

S>>Объяетам назначаются идентификаторы int64, при создание объекта он регистрирует себя в коллекции, при дестрое удаляется оттуда.
S>>в ссылках между объектами хранятся не указатели, а эти идентификаторы.
S>>Массив не годится там где объекты постоянно создаются — удаляются

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


K>
K>procedure FreeObject(var obj:pointer);
K>begin
K>  tobject(obj).Free;
K>  obj:=nil;
K>end;

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

K>..
K>freeobject(xxx);
K>
Re[4]: Подходы с присвоением больших сложных массивов
Здравствуйте, Khimik, Вы писали:

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


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


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

K>..

K>freeobject(xxx);
K>[/code]