Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wann werden Exception-Objekte freigegeben?

  Alt 9. Sep 2009, 19:31
Himitsu, ich kann das gerade wirklich nicht glauben. Ich hätte gewettet, dass du Delphi-Referenz durchsuchenAcquireExceptionObject kennst. Bezüglich Freigabe der Exception ohne genannte Funktion schaue man in System.pas:
Delphi-Quellcode:
//_HandleAnyException - selbiges in _HandleOnException
        JMP EBX //zum Handler springen

@@exceptFinally:
        JMP _HandleFinallyInternal

@@destroyExcept:
        {       we come here if an exception handler has thrown yet another exception }
        {       we need to destroy the exception object and pop the raise list. }

        CALL SysInit.@GetTLS
        MOV ECX,[EAX].RaiseListPtr
        MOV EDX,[ECX].TRaiseFrame.NextRaise
        MOV [EAX].RaiseListPtr,EDX

        MOV EAX,[ECX].TRaiseFrame.ExceptObject
        JMP TObject.Free
Sobald eine Exception also einen Except-Block verlässt (Reraise offensichtlich ausgenommen), wird die alte Exception freigegeben, AcquireExceptionObject natürlich ausgenommen.
Die von dir angesprochene Raiselist ist in einem anderen Fall wichtig:
Delphi-Quellcode:
try
  raise EFirstException.Create('');
except
  //die aktuelle Exception ist eine EFirstException
  try
    raise ESecondException.Create('');
  except
    //die aktuelle Exception ist eine ESecondException
  end;
  //die ESecondException ist zerstört worden: die EFirstException ist jetzt aktuell
end;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat