-
Всем привет!
Возможно ли сделать так, чтобы объект при уничтожении сам себе присваивал nil?
Или надо FreeAndNil использовать?
-
Не туда запостил. Сорьки.
-
> чтобы объект при уничтожении сам себе присваивал nil?
Прикольно, трупы сами себе могилу роют.
-
Как объект может себе нил присвоить? "Это же памятник" (с) ))
-
должен быть специальный "зомби" агент, т.е. объект... он должен знать адрес своей переменной в единственном экземпляре, и перекрытый деструктор в котором он типа на последнем издыхании... оп и присваивает.
> Или надо FreeAndNil использовать?
это проще всего.
-
А если у нас два указателя на один и тот же объект?
-
>А если у нас два указателя на один и тот же объект?
У меня как раз такой случай. В одном объекты, а в другом ссылки на объекты.
Я по ссылкам удаляю объекты.
-
Пока сделал удаление по ссылке:
procedure FreeAndNil(AObj: PObject);
begin
if PObject(AObj)^ <> nil then
begin
PObject(AObj)^.Free;
PObject(AObj)^ := nil;
end;
end;
Но AutoNil конечно же предпочтительней.
На мой взгляд такое возможно. Будем думать.
-
Короче надо свой ТОбжект писать. После FreeInstance это вполне возможно сделать, если есть внутренний массив со счетчиком и указателями ссылок.
-
> В одном объекты, а в другом ссылки на объекты.
чудеса бывают
-
> ухты © (10.12.18 19:29) [9]
иногда бывает полезно
-
полезно что? 2 списка? это совсем не америка
-
совсем америка случается совсем редко
иногда бывает полезно работать с объектами через ссылки
-
а как без ссылок?
-
В общем сделал 2 варианта.
1-й указываем адрес переменной объекта
procedure TZObject.Free(AObj: PObject);
begin
inherited Free;
PObject(AObj)^ := nil;
end;
а второй почти тоже самое.
procedure FreeAndNil(AObj: PObject);
begin
if (AObj <> nil) then if (PObject(AObj)^ <> nil) then
begin
PObject(AObj)^.Free;
PObject(AObj)^ := nil;
end;
end;
Оба работают.
-
как обычно - доступ к данным через адрес данных
а когда нужен дополнительный уровень косвенности,
работают с данными через адрес адреса данных
-
Ну так при чем тут ссылки и работа с объектами ? )))
-
не видишь суслика? а он есть )
-
>Ну так при чем тут ссылки и работа с объектами ? )))
Удобство управления для объектов созданных в разных местах.
У вас просто такой случай не попался, а в сложных системах ссылки - это вообще норма.
GenerateScene(1750, False, False); //<-Тут 1750 объектов добавилось
LoadObj(GC_MODELSPATH + '...', RT, @ZCam, @gObject); //<- +1 объект
LoadObj(GC_MODELSPATH + '...', RT, @ZCam, @gVarious); //<- +1 объект
Init3DGrid(@gGrid, 33, 50, RT, @ZCam); //<- +1 объект
//Ссылки на объекты
Scene.AddObject(@gObject);
Scene.AddObject(@gVarious);
Scene.AddObject(@gGrid);
// Работаем с объектами,
// а потом бац и по ссылкам удаляем все объекты
Scene.DestroyObjects;
// nil - просто индикатор удаленности
-
Так это выглядит в коде. Просто и удобно.
Особенно когда объектов тысячи. И все внешние переменные = nil.
procedure TZObject.Free(AObj: PObject);
begin
inherited Free;
PObject(AObj)^ := nil;
end;
procedure TZObjectsArray.DestroyObjects;
var
i: Integer;
begin
for i := Low(FObjects) to High(FObjects) do
begin
FObjects[i]^.Free(@FObjects[i]);
end;
SetLength(FObjects, 0);
FNumObjects := 0;
end;