Код: Выделить всё
! описание примера:
! есть достаточно большой класс, работающий примерно по такой же схеме, как и представленный ниже код
! 1. я создаю объект в одной процедуре, передаю его адрес в другую процедуру, в которой этот объект уничтожается.
! 2. при выходе из первой процедуры, есть проверка - уничтожен ли объект, если нет, то я его уничтожаю.
! 3. а клара и говорит, что объект не был уничтожен, при попытке dispose прога валится по GPF.
! данный пример не валится, но процедура Destruct вызывается два раза
! вопросы:
! почему так происходит?
! и как проверять, на то что объект был уничтожен при таком случае?
! примечание: схема передачи объекта в процедуру именно такая, другая схема не устраивает
PROGRAM
MAP
Main()
RefProc(LONG inAddr)
END
GlobalClass CLASS,TYPE ! описание глобального класса
Prop LONG
Construct PROCEDURE
Destruct PROCEDURE
END
code
Main()
Main PROCEDURE
LocalClass &GlobalClass ! ссылка на локальный объект
code
LocalClass &= NEW GlobalClass ! создали локальный объект
LocalClass.Prop = 10 ! присвоили значение свойству
RefProc(address(LocalClass)) ! вызываем другую процедуру и передаем в нее адрес локального объекта
if LocalClass &= NULL ! если объект уже уничтожен
message('= (NULL)') ! то покажем что он уничтожен
else
message('не равно NULL !!!') ! а если еще жив, то убъем
dispose(LocalClass)
end
RefProc PROCEDURE(LONG inAddr) ! процедура, в которой убивается передаваемый объект
ref &GlobalClass ! ссылка
code
ref &= (inAddr) ! сошлемся на тот объект, адрес которого передали
message(ref.Prop) ! на всякий пожарный покажем что там за значение
dispose(ref) ! убъем объект
GlobalClass.Construct PROCEDURE
code
message('Construct')
GlobalClass.Destruct PROCEDURE ! деструктор вызывается в данном примере 2 раза !!!
code
message('Destruct')