![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли данный код ;считать универсальным деструктором
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