![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать, уничтожен ли объект. [D7, XP]
Terasbetoni © (2008-10-02 18:44:00)Здравствуйте.
У меня есть указатель на некоторый адрес памяти. Ранее этот указатель указывал на некоторый объект. Затем этот объект, возможно, был удален. Как узнать теперь, имея в распоряжении этот указатель, был объект удален или нет.
Palladin (2008-10-03 08:36:00) [1]
> а что, под термином "указатель на объект" можно подразумевать
> разные вещи?
конечно
p:TObject; - указатель на объект
p:^TObject; - "указатель" на объект
Сергей М. (2008-10-03 08:32:00) [2]
> Terasbetoni (02.10.08 21:18) [40]
> некоторую переменную, находящуюся ВНЕ (потому и стороннюю)
> объекта, в которой будет располагаться информация о состоянии
> актуальности объекта
Ничто не мешает невзначай загадить содержимое такой переменной, равно как и сам объект, на которую ссылается переменная.
Один кривой шаг в кривом алгоритме - и вся схема "контроля актуальности" летит коту под хвост)
Лучший способ навести порядок в своем программно-объектном хозяйстве - ни на секунду не допускать в нем бардака и непонимания где что в какой момент лежит, что где и с чем происходит, кто в какой момент времени ответственен за создание и утилизацию тех или иных объектов .. и т.д. и т.п.
oldman (2008-10-02 21:27:00) [3]Типа
if flag then Обрабатываем_Перемпенyую
else Ты_Че_С_Ума_Сошел_?
oldman (2008-10-02 21:22:00) [4]
> Terasbetoni (02.10.08 21:18) [40]
а кто мешает до обращения к переменной проверить возможность обращения?
oldman (2008-10-02 21:20:00) [5]
> Terasbetoni (02.10.08 21:18) [40]
> под сторонним ресурсом я имею ввиду некоторую переменную,
> находящуюся ВНЕ (потому и стороннюю) объекта
чаво?
Terasbetoni (2008-10-02 21:18:00) [6]oldman © (02.10.08 19:43) [19]
oldman © (02.10.08 19:43) [20]
под сторонним ресурсом я имею ввиду некоторую переменную, находящуюся ВНЕ (потому и стороннюю) объекта, в которой будет располагаться информация о состоянии актуальности объекта. это и есть флаг, о котором вы говорите.
Palladin © (02.10.08 19:39) [14]
а что, под термином "указатель на объект" можно подразумевать разные вещи?
oxffff (2008-10-02 20:50:00) [7]offtop
Блин думаю, почему же я так хочу есть.
Только сейчас понял, что я же не ел после работы.
oxffff (2008-10-02 20:48:00) [8]
> Palladin © (02.10.08 20:36) [36]
Нет, это другое. Управляемым временем жизни - это просто дополнительная семантика копирования типа. Здесь ведется подсчет ссылок на объект для освобождения. Однако здесь нельзя просто переместить объект поскольку ведется только количество клиентов типа, а установить клиентов существенно затруднено. В управляемой кучи идея проще не нужно вести количество клиентов, но нужно вести самих клиентов, причем только ключевых, тех по которым рекурсивно можно определить всех остальных неявных. Поэтому нет никакой нагрузки на доп. инфу типа счетчик ссылок, атомарное его изменение и саму семантику копирования. Однако нет детерменированного способа освобождения объекта, и поэтому и финализации, однако есть общий подход к детерминированной финализации.
Palladin (2008-10-02 20:37:00) [9]тьфу, управляемая куча :)
Palladin (2008-10-02 20:36:00) [10]ну имеются ввиду, типы Variant, интерфейсы, дин. массивы и т.д.... за состоянием их идентификаторов следит rtl... управляющая куча должна иметь, примерно, тот же механизм, дабы отслеживать работу с идентификаторами и определять валидность ссылки...
oxffff (2008-10-02 20:33:00) [11]
> Palladin © (02.10.08 20:32) [34]
Не понял вопроса. Поясни please. :)
Palladin (2008-10-02 20:32:00) [12]
> oxffff © (02.10.08 20:29) [32]
то есть, я так понимаю, грубо говоря, тот же механизм что и с типами, с управляемым временем жизни?
Palladin (2008-10-02 20:29:00) [13]
> oxffff © (02.10.08 20:27) [30]
конечно можно проще, я специально разделил на несколько участков, чтобы показать, что они вообще могут находится в разных местах приложения и не подозревать о существовании друг друга....
oxffff (2008-10-02 20:29:00) [14]
> Palladin © (02.10.08 20:26) [29]
Управляемая куча так и работает, когда делает уплотнение.
Изменяет все ссылки на этот объект самостоятельно.
oldman (2008-10-02 20:28:00) [15]
> Palladin ©
> oxffff ©
Ребята, вы сейчас автора топика отправите в нокаут!
oxffff (2008-10-02 20:27:00) [16]
> Palladin © (02.10.08 20:16) [27]
Можно написать проще.
procedure abc;
var a,b:Tobject;
begin
a:=Tobject.create;
b:=a;
a:=sysrealloc(a,a.instanceSize);
b:=a;
end;
А вообще лучше забить на это и использовать семантику копирования интерфейса, только избегать зацикливания ссылок.
Palladin (2008-10-02 20:26:00) [17]хм, считаешь, управляемая куча сможет переопределить новое значение, замест старого, указателя, находящегося в стеке? )
oxffff (2008-10-02 20:22:00) [18]
> Palladin © (02.10.08 20:16) [27]
Я то все сразу понял. Есть понятия корня-это то что сслылается в кучу.
Поэтому если ты что сдвинул, то нужно изменить все корни на это сдвинутое, включая корни в других объектах кучи.
Здесь нужно делать вручную, в отличии от управляемой кучи.
Я и написал oxffff © (02.10.08 20:07) [25]
:))
Palladin (2008-10-02 20:16:00) [19]
> oxffff © (02.10.08 20:14) [26]
ты не понял, что я имею в виду.
Procedure proc3(o:TObject);
var
l:TObject;
Begin
переинстанцирование l
End;
Procedure proc2(o:TObject);
var
l:TObject;
Begin
l:=o;
proc3(l);
работа с l
End;
Procedure proc1(o:TObject);
var
l:TObject;
Begin
l:=o;
proc2(l);
Работа с l
End;
теперь понял?
oxffff (2008-10-02 20:14:00) [20]
> oxffff © (02.10.08 20:07) [25]
В управляемых кучах все объекты, а они несет в себе тип.
Технически в native Delphi можно реализовать менеджер памяти, чтобы ответить на вопросы:
1. Является указатель на объект - указателем на объект.
2. Является ли объект объектом этого типа.
Но нужно слегка изменить способы выделения памяти.