AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi EOutOfResources erzeugt Speicherleck

EOutOfResources erzeugt Speicherleck

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

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 21:30
Hallo zusammen,

nochmals vielen Dank für die rege Beteiligung.

@littleDave: Klingt plausibel, funktioniert aber irgendwie nicht. Der Inhalt von PBoolean(cardinal(e) + delta)^ ist zwar False und wird dementsprechend auf True gesetzt, aber die Meldung vom Speichermanager (der bei Delphi2010 ja wohl FastMem ist) bleibt die gleiche.

@himitsu: Es geht ja nicht darum, dass ich die Exception auslösen, sondern dass ich darauf reagieren will. Mache ich ja auch, nur bleibt dabei eben die Exception übrig.
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

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

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 21:41
Ah, du hast Delphi 2010, da musst du es so machen:

Delphi-Quellcode:
    on e: EOutOfResources do
    begin
      delta := cardinal(EHeapException.ClassParent.InstanceSize) - SizeOf(Pointer); // 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.)
In Delphi 2010 wird an das Ende der Klasseninstanz noch eine TMonitor-Referenz gespeichert. Daher muss der Pointer auf diese Referenz vom Offset noch abgezogen 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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#3

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 21:46
Ich sag ja, ist ein Fehler in Delphi.
Diese Exception dürfte erst garnicht ständig neu erzeugt werden ... wie es richtig geht, sieht man an EOutOfMemory.
Aber man kann es eh nicht ordentlich implementieren, da AllowFree privat ist und somit in anderen Units nicht nutzbar ist.
(sowas gehört in protected)

Fazit: Dieses Singleton ist fehlerhaft implementiert und falsch verwendet.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 5. Dez 2010 um 21:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

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

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 21:50
Die EOutOfResources-Exception müsste im Constructor automatisch die "AllowFree"-Variable auf True setzen oder nicht von EHeapException abgeleitet sein. Diese Exception soll ja darauf hinweisen, dass keine Handles mehr zur Verfügung stehen - jedoch braucht eine Exception an sich kein Handle und sollte somit eigentlich ohne Probleme erstellt werden können (im Gegensatz zur EOutOfMemory-Exception) - auch wenn das System keine Handles mehr 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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#5

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 21:55
Auch EOutOfMemory ist schon fehlerhaft implementiert.

Bei diesen Exceptions müßten nicht nur die globalen Exceptionobjekte schon erstellt worden sein, sondern auch schon das ganze Meldungsfenster.

Bei EOutOfResources braucht man zwar für das Exceptionobjekt kein Handle, aber für das Fehlerfenster schon.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

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

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 22:00
Als fehlerhaft würde ich das nicht bezeichnen, denn es muss ja nicht unbedingt ein Fester geben (Console-Anwending, Service, etc.). Daher finde ich diese pauschale Bezeichnung falsch. Zudem ist bei diesen Fehlern wichtig, dass man vorher nicht mehr benötigte Resourcen freigibt, bevor eine Meldung angezeigt wird.
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#7

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 22:04
EOutOfResources ist in Classes deklariert, wärend EHeapException in SysUtils deklariert ist.
Da AllowFree aber als Privat deklariert ist, kann man externe Nachkommen von EHeapException überhaupt nicht ordnungsgemäß verwenden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

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

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 22:07
Klar, die Variable gehört in protected - ich meinte eher, dass es falsch wäre, das Meldungsfenster gleich mit zu initialisieren.
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
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: EOutOfResources erzeugt Speicherleck

  Alt 5. Dez 2010, 22:15
So, jetzt ist die Meldung weg. Super und nochmals danke.

Warum überhaupt eine EOutOfResources kommt, ist mir zwar immer noch nicht wirklich klar aber zumindest bleiben die Exceptions jetzt nicht mehr im Speicher hängen.

In meinem Fall werden doch nur einige GDI-Handles angefordert. Wird der dafür nötige Speicher ebenfalls gleich mitbestellt (dann wäre es logisch) oder wie muss man sich das vorstellen?

Das Programm hat zur Laufzeit zwischen 100-120 der GDI-Handles, Tendenz gleichbleibend.
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: EOutOfResources erzeugt Speicherleck

  Alt 6. Dez 2010, 00:26
Also ich halte es immer noch für falsch bewusst in eine Exception reinzulaufen. Ich meine, ich lasse Autos ja auch nicht bewusst an einer Ampel Unfälle bauen und stelle einen Abschleppwagen da neben, um die Wracks weg zu räumen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:45 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