AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi EOutOfResources erzeugt Speicherleck
Thema durchsuchen
Ansicht
Themen-Optionen

EOutOfResources erzeugt Speicherleck

Ein Thema von Schorschi5566 · begonnen am 5. Dez 2010 · letzter Beitrag vom 6. Dez 2010
 
Benutzerbild von littleDave
littleDave

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

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 15:21
Die Exception EOutOfResources ist eine besondere Exception, da sie von der EOutOfMemory - Exception abgeleitet wird. Erstell mal ein Test-Projekt, binde FastMM ein und auf die Form1 klatscht du ein Button drauf. Im Click-Handler schreibst du folgendes:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  raise EOutOfResources.Create('bla bla blub');
end;
Dann starte das Testprogramm, klick den Button und beende das Programm: und siehe da: EOutOfResources wird nicht freigegeben. Wenn du jetzt irgend eine andere beliebige Exception (außer EOutOfMemory) benutzt, wird diese korrekt freigegeben.

Exceptions, die von EOutOfMemory abgeleitet sind, dürfen also nicht so geworfen werden. Für die EOutOfMemory gibt es in der SysUtils-Unit die Funktion OutOfMemoryError , ob es das für EOutOfResources auch gibt, weiß ich nicht.

Die Ausnahme ist sehr sinnvoll: wenn kein Speicherplatz mehr vorhanden ist, soll ja diese Exception geworfen werden. Blöd wäre jetzt nur, wenn für die Exception auch kein Speicher mehr vorhanden wäre. Daher wird eine Instanz der Exception global beim Start angelegt und diese Instanz wird einfach immer wieder neu geworfen.

[Ergänzung]
Mal ein Auszug aus der Delphi-Hilfe für EHeapException:
Zitat:
Die von EHeapException abgeleiteten Klassen EOutOfMemory und EInvalidPointer werden dazu verwendet, fehlgeschlagene Zuweisungen von dynamischem Speicher und ungültige Zeigeroperationen abzufangen.

Hinweis: Speicher für diese Exceptions wird im Voraus zugewiesen, sobald eine Anwendung startet. Die Zuweisung bleibt bestehen, solange die Anwendung läuft. EHeapException oder Nachkommen davon dürfen niemals direkt ausgelöst werden.
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

Geändert von littleDave ( 5. Dez 2010 um 15:32 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz