Конференция "Прочее" » FreeAndNil
 
  • dmk © (10.12.18 12:26) [0]
    Всем привет!
    Возможно ли сделать так, чтобы объект при уничтожении сам себе присваивал nil?
    Или надо FreeAndNil использовать?
  • dmk © (10.12.18 12:28) [1]
    Не туда запостил. Сорьки.
  • Плохиш © (10.12.18 13:07) [2]

    > чтобы объект при уничтожении сам себе присваивал nil?

    Прикольно, трупы сами себе могилу роют.
  • ухты © (10.12.18 13:16) [3]
    Как объект может себе нил присвоить? "Это же памятник" (с) ))
  • sniknik © (10.12.18 16:58) [4]
    должен быть специальный "зомби" агент, т.е. объект... он должен знать адрес своей переменной в единственном экземпляре, и перекрытый деструктор в котором он типа на последнем издыхании... оп и присваивает.

    > Или надо FreeAndNil использовать?
    это проще всего.
  • Mystic © (10.12.18 18:03) [5]
    А если у нас два указателя на один и тот же объект?
  • dmk © (10.12.18 19:18) [6]
    >А если у нас два указателя на один и тот же объект?
    У меня как раз такой случай. В одном объекты, а в другом ссылки на объекты.
    Я по ссылкам удаляю объекты.
  • dmk © (10.12.18 19:21) [7]
    Пока сделал удаление по ссылке:
    procedure FreeAndNil(AObj: PObject);
    begin
     if PObject(AObj)^ <> nil then
     begin
       PObject(AObj)^.Free;
       PObject(AObj)^ := nil;
     end;
    end;

    Но AutoNil конечно же предпочтительней.
    На мой взгляд такое возможно. Будем думать.
  • dmk © (10.12.18 19:26) [8]
    Короче надо свой ТОбжект писать. После FreeInstance это вполне возможно сделать, если есть внутренний массив со счетчиком и указателями ссылок.
  • ухты © (10.12.18 19:29) [9]

    > В одном объекты, а в другом ссылки на объекты.
    чудеса бывают
  • Sha © (10.12.18 20:33) [10]
    > ухты ©   (10.12.18 19:29) [9]

    иногда бывает полезно
  • ухты © (10.12.18 22:15) [11]
    полезно что? 2 списка? это совсем не америка
  • Sha © (10.12.18 22:29) [12]
    совсем америка случается совсем редко

    иногда бывает полезно работать с объектами через ссылки
  • ухты © (10.12.18 23:11) [13]
    а как без ссылок?
  • dmk © (10.12.18 23:27) [14]
    В общем сделал 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;

    Оба работают.
  • Sha © (10.12.18 23:29) [15]
    как обычно - доступ к данным через адрес данных

    а когда нужен дополнительный уровень косвенности,
    работают с данными через адрес адреса данных
  • ухты © (10.12.18 23:31) [16]
    Ну так при чем тут ссылки и работа с объектами ? )))
  • Sha © (10.12.18 23:50) [17]
    не видишь суслика? а он есть )
  • dmk © (11.12.18 00:43) [18]
    >Ну так при чем тут ссылки и работа с объектами ? )))
    Удобство управления для объектов созданных в разных местах.
    У вас просто такой случай не попался, а в сложных системах ссылки - это вообще норма.

     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 - просто индикатор удаленности
  • dmk © (11.12.18 00:51) [19]
    Так это выглядит в коде. Просто и удобно.
    Особенно когда объектов тысячи. И все внешние переменные = 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;
 
Конференция "Прочее" » FreeAndNil
Есть новые Нет новых   [134427   +34][b:0][p:0.001]