Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#14

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 18:59
Soweit ich das gesehen habe, ist das ganze (in Delphi 7) nicht sauber umgesetzt, da es - nicht wie bei EOutOfMemory - keine Methode gibt, die das gleiche für die EOutOfResources-Exceptions macht (habe keine gefunden).

Erstmal grundlegend:
EHeapException hat eine private Boolean-Variable namens "AllowFree". Wenn diese True ist, wird die Instanz wirklich aus dem Speicher gelöscht, ansonsten nicht. Zur Prüfung dieser Variable überschreibt EHeapException die virtuelle TObject-Methode "FreeInstance" und baut dort die Prüfung ein (siehe SysUtils.pas -> EHeapException.FreeInstance).

Um das zu umgehen, hab ich eben eine Quick-and-Dirty-Lösung zusammengebaut

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var delta: cardinal;
begin
  try
    raise EOutOfResources.Create('Out of resources');
  except
    on e: EOutOfResources do
    begin
      delta := cardinal(EHeapException.ClassParent.InstanceSize); // den Offset zur Boolean-Variable auslesen
      PBoolean(cardinal(e) + delta)^ := True; // "AllowFree" auf "True" setzen (Offset + Instance-Pointer = Heap Pointer)

    end; // <-- hier wird die Exception dann automatisch freigegeben (siehe auch: AcquireExceptionObject, etc.)
  end;
end;
Das ganze muss natürlich etwas angepasst werden, falls in neueren Delphi-Versionen die Klasse "EHeapException" noch weitere Variablen hat.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat