Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-98335
Aga
2002-09-05 16:41
2002.09.30
ярлыки


1-98049
SaS13
2002-09-19 10:16
2002.09.30
---|Ветка была без названия|---


1-98142
TopGun
2002-09-16 20:21
2002.09.30
Глючит программа


6-98246
Leny
2002-07-26 08:27
2002.09.30
Потоки


1-98117
RV
2002-09-17 10:05
2002.09.30
Где у меня происходит утечка памяти? (менеджер задач так