AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Memleaks bei Beenden der Anwendung vermeiden?
Thema durchsuchen
Ansicht
Themen-Optionen

Memleaks bei Beenden der Anwendung vermeiden?

Ein Thema von anse · begonnen am 24. Mär 2010 · letzter Beitrag vom 25. Mär 2010
Antwort Antwort
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
194 Beiträge
 
Delphi 11 Alexandria
 
#1

Memleaks bei Beenden der Anwendung vermeiden?

  Alt 24. Mär 2010, 19:29
Wie sinnvoll ist es, Objekt Instanzen, speziell solche die viel Speicher verbrauchen, bei einer Fenster Anwendung in Form.OnDestroy oder sonstwo noch zu zerstören? Ich hab da eine Handvoll FreeAndNil() in MainForm.OnDestroy, hatte da aber eine falsche Reihenfolge was eine Access Violation zur Folge hatte. Da dachte ich mir - warum soll ich die Zeilen nicht ganz entfernen, Windows kümmert sich doch selbst darum?
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Memleaks bei Beenden der Anwendung vermeiden?

  Alt 24. Mär 2010, 20:46
Warum?

Wenn man an einer Stelle anfängt zu schludern, dann passiert es womüglich auch an anderen Stellen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
194 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Memleaks bei Beenden der Anwendung vermeiden?

  Alt 24. Mär 2010, 21:48
Ich schludere für gewöhnlich nicht (mehr). An anderen Stellen als OnDestroy würde ich mich ohrfeigen wenn ich vermeidbare Speicherlecks hinterlassen würde. Es ist also keine Frage der Disziplin beim Programmieren. Ich frage mich nur, ob es Sinn hat, Code zu schreiben der überhaupt keinen Effekt hat. Oder hat er einen Effekt? Nein, denke nicht, wie auch.
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Memleaks bei Beenden der Anwendung vermeiden?

  Alt 25. Mär 2010, 06:40
Ich sehe das wie Himitsu,

Du solltest immer alles was du Allokierst auch selbst wieder Frei geben. Wenn du so was nicht gerne machst, dann nimm doch Java, da ist eh alles egal.

Ich schreibe in meinen Code nach der Verwendung einer Klasse sogar immer noch Extra dsa setzen auf NIL, schaden tut das nicht. Und wenn der Compiler der Meinung ist, dass es unnötig ist, schmeißt er den Code eh wieder weg.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Memleaks bei Beenden der Anwendung vermeiden?

  Alt 25. Mär 2010, 06:53
Zitat von Corpsman:
Ich schreibe in meinen Code nach der Verwendung einer Klasse sogar immer noch Extra dsa setzen auf NIL, schaden tut das nicht.
Doch, der Übersichtlichkeit. Jemand, der deinen Code liest, fragt sich doch: Warum macht er das?

Wenn schon, verwende FreeAndNil. Macht das Gleiche, ist auch überflüssig, aber inzwischen Usus unter Delphi-Programmierern.

Zur eigentlichen Frage: Also wenn deine SW nur(!) zum Programmende Speicher nicht freigibt (Siehe Indy), dann ist das kein Problem, hat aber einen kleinen Haken:

Wenn ich Delphi-Programme hinsichtlich Speicherlecks mit FastMM prüfe, dann bin ich erst dann zufrieden, wenn das Fehlerlog leer ist, bzw. die üblichen VCL-Macken zeigt. Da stört dann ein redundantes Freigeben einfach. Schlimm, wenn diese Struktur eine Liste mit Mio Einträgen ist (ein Cache z.B.). Das müllt mir das FastMM-Log zu. Da geb ich das doch eben frei und kann weitermachen.

Ich frage mich aber, wie Du sicherstellst, das dein Programm sonst keine Speicherlecks erzeugt? Glotzt du nur auf den Taskmanager?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Memleaks bei Beenden der Anwendung vermeiden?

  Alt 25. Mär 2010, 06:55
Nötig ist es nicht, wie du schon selbst sagst. Wenn der Prozess beendet wird, schließt Windows alle offenen von dem Prozess belegten Ressourcen (Dateihandles, Fensterhandles, usw.) und gibt auch den gesamten Adressraum des Prozesses wieder frei. Aber ich bin der Meinung, dass es schlechter Stil ist, wenn man selbst allozierten Speicher nicht auch selbst wieder frei gibt und sei es nur der Form halber. Allerdings könnte auch eine Situation auftreten, wo das dann doch eine Rolle spielt, wenn nämlich jemand anders das Programm erweitert und sich darauf verlässt, dass du deinen Speicher auch wieder frei gibst.

Und wenn das Freigeben von Speicher zu Fehlern führt, dann hast du in deinem Code einen Fehler und den solltest du finden und beseitigen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Memleaks bei Beenden der Anwendung vermeiden?

  Alt 25. Mär 2010, 07:27
Hallo,

also ich hab da ein Beispiel einer dll, wenn ich die am Schluß nicht selbst free-e *g* dann bleibt die dll geladen und beim nächsten Start des Programmes, wenn nicht der Rechner neu gestartet wurde, kann die dll nicht mehr genutzt werden. Also macht Windows nicht unbedingt wirklich alles frei beim beenden.

Gruß

tom
Tom
Just DO it
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: Memleaks bei Beenden der Anwendung vermeiden?

  Alt 25. Mär 2010, 13:39
Zitat von alzaimar:
Zitat von Corpsman:
Ich schreibe in meinen Code nach der Verwendung einer Klasse sogar immer noch Extra dsa setzen auf NIL, schaden tut das nicht.
Doch, der Übersichtlichkeit. Jemand, der deinen Code liest, fragt sich doch: Warum macht er das?

Wenn schon, verwende FreeAndNil. Macht das Gleiche, ist auch überflüssig, aber inzwischen Usus unter Delphi-Programmierern.
Ich sehe das situationsabhängig. Normalerweise rufe ich nur Free auf. Wird allerdings später nochmals auf Assigned überprüft, dann bietet sich ein FreeAndNil an. Du setzt ja sicherlich auch nicht alle anderen Variablen nach Gebrauch auf 0, Leerstring oder sonstiges, oder?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz