с fdestroycount
function TInterfacedObject._Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
begin
_Release:=interlockeddecrement(frefcount);
if _Release=0 then
begin
if interlockedincrement(fdestroycount)=1 then // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
self.destroy;
end;
end;
Этот fdestroycount нигде не используется кроме _Release. Зачем он ?? Так как он нигде не используется, то когда frefcount станет равным нулю, то interlockedincrement(fdestroycount) в любом случае будет равен 1. И зачем всё это ?
вопрос в чем? зачем вообще делать защиту от дурака?
ок, т.е. вопрос ради вопроса.. ты глянь исходники в mingw например, там такого гора
В делфи вон оно как сделано class procedure TInterfacedObject.__MarkDestroying(const Obj); var LRef: Integer; begin repeat LRef := TInterfacedObject(Obj).FRefCount; until AtomicCmpExchange(TInterfacedObject(Obj).FRefCount, LRef or objDestroyingFlag, LRef) = LRef; end;
protected frefcount : longint; FDestroyCount : longint; FDestroyCount protected, так что вполне могут быть варианты
Обсуждают сегодня