Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4 5

FreeAndNil


dmk ©   (10.12.18 12:26

Всем привет!
Возможно ли сделать так, чтобы объект при уничтожении сам себе присваивал 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;


Страницы: 1 2 3 4 5 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо