Текущий архив: 2002.09.30;
Скачать: CL | DM;
Вниз
Можно ли данный код считать универсальным деструктором Найти похожие ветки
← →
AlexT1000 (2002-09-17 13:23) [0]Часто переменной объекта после разрушения нужно присвоить значение nil.
Можно ли данный код считать корректным для любого объекта?
procedure _Free( Sender :TObject);
begin
if Assigned(Sender) then Sender.Free;
integer(Sender) := 0;
end;
← →
Ученик © (2002-09-17 13:27) [1]Есть FreeAndNil
← →
andrey_pst © (2002-09-17 13:31) [2]Зачем вызывать процедуру, если можно написать просто MyObject := nil; ?
Это похоже на изобретение овального колеса.
← →
Ученик © (2002-09-17 13:39) [3]>andrey_pst © (17.09.02 13:31)
Что имеется ввиду "MyObject := nil;" ?
← →
Старый паскалист (2002-09-17 13:45) [4]Во первых, как сказал Ученик © (17.09.02 13:27)
Есть FreeAndNil, которая делает то же самое.
Во вторых, нужно было написать _Free( var Sender :TObject);
(Про integer(Sender) := 0 я ничего говорить не буду. Чёрт с ним)
И в третьих, этот код никак не спасёт отца русской демократии,
если на объект ссылаются несколько ссылок.
← →
Shaman_Naydak © (2002-09-17 14:55) [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;
← →
AlexT1000 (2002-09-17 16:05) [6]>>> Ученик ©
Есть FreeAndNil . не знал. век учись. это как раз то что нужно.
код , кста, практически аналогичен моей процедуре.
>> andrey_pst ©
Зачем вызывать процедуру, если можно написать просто MyObject := nil; ?
да просто лень писать две строки.
obj.free;
obg :=nil;
>>> Старый паскалист (17.09.02 13:45)
Во вторых, нужно было написать _Free( var Sender :TObject);
по-моему объекты итак передаются по ссылке , а не как копия объекта. так что я думаю vаr не нужен.
если на объект ссылаются несколько ссылок.
это бывает редко. вся буча затеяна из=за лени писат две строки кода
← →
Внук © (2002-09-17 16:11) [7]AlexT1000 (17.09.02 16:05)
Объект-то передается по ссылке, и уничтожится нормально, только ссылка не обнулится, вернее, оригинальная ссылка останеться, а обнулится ее копия.
← →
qube © (2002-09-17 16:13) [8]
> по-моему объекты итак передаются по ссылке , а не как копия
> объекта. так что я думаю vаr не нужен.
не передаются объекты по ссылке. Да, в Дельфи память под экземпляры класса выделяется всегда динамически, и при передаче процедуре объекта фактически передается указатель на объект. НО изменить сам указатель вызовом Sender := nil без var не выйдет.
← →
AlexT1000 (2002-09-17 16:26) [9]ОК. Всем спасибо.
мораль этой темы такова. бум теперь юзать FreeAndNil
Страницы: 1 вся ветка
Текущий архив: 2002.09.30;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.023 c