Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли данный код ;считать универсальным деструктором


AlexT1000 ©   (2002-09-17 13:23:00) 

Часто переменной объекта после разрушения нужно присвоить значение nil.
Можно ли данный код считать корректным для любого объекта?


procedure _Free( Sender :TObject);
begin
if Assigned(Sender) then Sender.Free;
integer(Sender) := 0;
end;


AlexT1000   (2002-09-17 16:26:00) [1]

ОК. Всем спасибо.
мораль этой темы такова. бум теперь юзать FreeAndNil


qube   (2002-09-17 16:13:00) [2]


> по-моему объекты итак передаются по ссылке , а не как копия
> объекта. так что я думаю vаr не нужен.

не передаются объекты по ссылке. Да, в Дельфи память под экземпляры класса выделяется всегда динамически, и при передаче процедуре объекта фактически передается указатель на объект. НО изменить сам указательвызовом Sender := nil без var не выйдет.


Внук   (2002-09-17 16:11:00) [3]

AlexT1000 (17.09.02 16:05)
Объект-то передается по ссылке, и уничтожится нормально, только ссылка не обнулится, вернее, оригинальная ссылка останеться, а обнулится ее копия.


AlexT1000   (2002-09-17 16:05:00) [4]

>>> Ученик ©
Есть FreeAndNil . не знал. век учись. это как раз то что нужно.
код , кста, практически аналогичен моей процедуре.

>> andrey_pst ©
Зачем вызывать процедуру, если можно написать просто MyObject := nil; ?
да просто лень писать две строки.
obj.free;
obg :=nil;

>>> Старый паскалист (17.09.02 13:45)
Во вторых, нужно было написать _Free( var Sender :TObject);
по-моему объекты итак передаются по ссылке , а не как копия объекта. так что я думаю vаr не нужен.

если на объект ссылаются несколько ссылок.
это бывает редко. вся буча затеяна из=за лени писат две строки кода




Shaman_Naydak   (2002-09-17 14:55:00) [5]

Вот вам вариант ф-ции, которая сработает лишь один раз.
Спасет даже от случая, когда на один объект ссылаются несколько ссылок. (работает за счет обнуления ссылки на класс в экзмепляре объекта. Кстати, из-за этого гарантировано получим access violation при попытке работать после освобождения (при вызове виртуального метода):) )

Вариант передачи по ссылке:
procedure FreeObject(var Obj: TObject); register;
asm
MOV ECX, EAX
MOV EAX, [EAX]
TEST EAX, EAX
JE @@exit
MOV [ECX].DWORD, 0
MOV ECX, [EAX]
TEST ECX, ECX
JE @@exit
PUSH EAX
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
POP EAX
MOV [EAX].DWORD, 0
@@exit:
end;

Вариант передачи по значению:
procedure FreeObject(Obj: TObject); register;
asm
TEST EAX, EAX
JE @@exit
MOV ECX, [EAX]
TEST ECX, ECX
JE @@exit
PUSH EAX
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
POP EAX
MOV [EAX].DWORD, 0
@@exit:
end;


Старый паскалист   (2002-09-17 13:45:00) [6]

Во первых, как сказал Ученик © (17.09.02 13:27)
Есть FreeAndNil, которая делает то же самое.

Во вторых, нужно было написать _Free( varSender :TObject);
(Про integer(Sender) := 0 я ничего говорить не буду. Чёрт с ним)

И в третьих, этот код никак не спасёт отца русской демократии,
если на объект ссылаются несколько ссылок.


Ученик   (2002-09-17 13:39:00) [7]

>andrey_pst © (17.09.02 13:31)
Что имеется ввиду "MyObject := nil;" ?


andrey_pst   (2002-09-17 13:31:00) [8]

Зачем вызывать процедуру, если можно написать просто MyObject := nil; ?
Это похоже на изобретение овального колеса.


Ученик   (2002-09-17 13:27:00) [9]

Есть FreeAndNil


Наверх

Титульная страница Поиск, карта сайта Написать письмо