AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Speicherleck bei der Verwendung von anonymen Methoden
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherleck bei der Verwendung von anonymen Methoden

Ein Thema von carlo93 · begonnen am 15. Okt 2011 · letzter Beitrag vom 4. Nov 2011
Antwort Antwort
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#1

AW: Speicherleck bei der Verwendung von anonymen Methoden

  Alt 16. Okt 2011, 17:10
@carlo93

Ohne einen überheblichen Ton kannst du wohl überhaupt nichts von dir geben?
Nö - das ist seine "nette" Art mit anderen umzugehen... Das findest Du in fast jedem seiner Beiträge.

Zu Deiner Frage:
Der Compiler speichert die von anonymen Methoden genutzen Variablen (Variablenbindung). Diese werden in TInterfacedObject-Derivaten mit Referenzzählung abgelegt.
Aus für mich nicht ersichtlichen Gründen besitzen diese Frames nach der Erstellung der anonymen Methode einen RefCount-Wert von 2. Nach Beendigung der Methode (in Deinem Fall TForm1.Create) wird dieser Wert wieder um zwei verringert und das Frame-Objekt aus dem Speicher entfernt. Tritt jetzt der Fall ein, das die anonyme Methode in einer anderen weiterverwendet wird, erhöht der Compiler RefCount des Frame-Objektes um eins und es wird beim Aufräumen am Ende der Methode nicht mehr gelöscht. So weit - so gut. Dummerweise verringert der Compiler in diesem Fall RefCount nur um eins und somit bleibt das Frame-Objekt auch zum Schluß erhalten. Meiner Meinung nach ist das ein Fehler im Compiler.
Da ich bei der Programmierung meines Frameworks auch auf dieses Problem gestoßen bin, habe ich dafür eine einfache Lösung entwickelt:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Func: TFunc<String>;
begin
  ReportMemoryLeaksOnShutdown:=true;
  Func:=
    function: String
    begin
      Result:=Edit1.Text;
    end;
  Memo1.Lines.Add(Func);
  FProc:=
    procedure
    begin
      Memo1.Lines.Add(Func);
    end;
  {$IF (CompilerVersion>=20) and (CompilerVersion<24)} //<- optimistisch ;-)
  if RefCount(Func)>2 //-> es existieren zusätzliche Referenzen
    then ReleaseMethod(Func); //<- RefCount wird um das fehlende Mal verringert
  {$IFEND}
end;
Lösungen:
- [...]
- [...]
- [...]
- [...]
- schmutzige Tricks, um diesen Fehler provisiorisch zu umgehn *1

1) IInterface(PPointer(@Func)^)._Release; als letzen Befehl in FormCreate,
aber sollte dieser Fehler wirklich mal irgendwann behoben werden, dann raucht dir die Anwendung ab.
Insofern entspricht das etwa himitsu's Lösung Nummer 5 mit vorherigem Test.
Delphi-Quellcode:
  {$IF (CompilerVersion>=20) and (CompilerVersion<???)} 
  if IInterface(PPointer(@Func)^)._AddRef>3
    then IInterface(PPointer(@Func)^)._Release;
  IInterface(PPointer(@Func)^)._Release;
  {$IFEND}
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
carlo93

Registriert seit: 15. Okt 2011
3 Beiträge
 
#2

AW: Speicherleck bei der Verwendung von anonymen Methoden

  Alt 16. Okt 2011, 18:30
Danke himitsu und Thom! Das hilft mir weiter.

@Stevie
Danke für's Nachschauen. Dennoch macht für mich gerade der Ton die Musik. Ein "Ist schon lange bekannt" beinhaltet im Unterton ein "Ach - und dir nicht!? Wohl keine Ahnung von der Thematik?".
Auf eine sachlich gestellte Frage erwarte ich auch eine sachliche Antwort. Die meisten hier im Forum können das. Im Gegensatz dazu klingt nahezu jede Antwort von Dir überheblich. Schade - bei Deinem Wissen hättest Du das eigentlich nicht nötig.

Zum Thema "Workarounds"
  1. Report #: 83259 None
  2. Report #: 78066 Put anonymous method in function. (Entspricht Sebastian's Vorschlag vor Deinem Beitrag)

Beide Einträge betreffen übrigens "Version: 14.0". Dumme Frage: Gab's zu diesem Zeitpunkt schon anonyme Methoden?


Folgerichtig wäre der einzig wahre Beitrag, bei dem Du nichts zu bemängeln hättest, dieser hier:
"Ja. Ja."
@FredlFesl
Sorry - aber das ist einfach dumm und keine sachliche Antwort wert.

Ich glaub, ich brauch Nachhilfe. Ich find den 'überheblichen Ton' nämlich nicht.
Das ist durchaus möglich. Ich weiß nicht, wie alt Du bist - ich gehöre einer Generation an, die (noch) gelernt hat, seinem Gegenüber eine entsprechende Portion an Respekt und Achtung entgegenzubrigen. Und zwar unabhängig vom Alter, Geschlecht und Wissensstand. So etwas scheint aber leider immer mehr aus der Mode zu kommen. Wer einen derartigen Ton für angemessen hält, kann diesen gern unter denen anwenden, die das für normal halten - bei mir bitte nicht.

Stevie's Post brachten - außer mehreren Belehrungen - keinen Beitrag zur Lösung des Problems. Wozu also das Ganze?
Das es ganz anders geht, beweisen die Beiträge von Sebastian, himitsu und Thom. Nochmals vielen Dank an die drei!

Damit beende ich die Off-Topic-Diskussion meinerseits. Wer noch Bemerkungen dazu hat - bitte per PM.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Speicherleck bei der Verwendung von anonymen Methoden

  Alt 16. Okt 2011, 18:48
Edit: egal...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (16. Okt 2011 um 19:02 Uhr)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: Speicherleck bei der Verwendung von anonymen Methoden

  Alt 16. Okt 2011, 20:06
Sorry - aber das ist einfach dumm und keine sachliche Antwort wert.
Es entspricht dem, was Du erwartest. Antworten auf deine Fragen und sonst nix.
Zitat:
Das ist durchaus möglich.
Aha. Das dachte ich mir. Zwischen den Zeilen kann man übrigens alles lesen. Das lehrt mich meine Lebenserfahrung. Und lass uns nicht über Alter und Generation reden. Das könnte nach hinten losgehen
Zitat:
Stevie's Post brachten - außer mehreren Belehrungen - keinen Beitrag zur Lösung des Problems.
Doch. Aber man muss klicken und selbst im QC nachlesen. Das könnte natürlich überheblich sein

Überheblich könnte übrigens auch der sein, der frisch in einem Forum ist und gleich rumkoffert.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: Speicherleck bei der Verwendung von anonymen Methoden

  Alt 17. Okt 2011, 08:36
Ja, manche Mitglieder sind manchmal etwas unhöflich oder streitlustig.
Wenn du Stevies ersten Betrag anstößig findest solltest du dir aber ein dickeres Fell zulegen. Durch solche Reaktionen wie von dir eskalieren solche Situationen häufig und damit geht dir eine Menge Antworten, vernünftiger Diskussion und letztlich Wissen verloren.
Und: die Links zu den QC-Einträgen sind wertvolle Informationen und wenn nicht dir, dann helfen sie vielleicht später jemand anderem der diesen Thread liest.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#6

AW: Speicherleck bei der Verwendung von anonymen Methoden

  Alt 17. Okt 2011, 11:24
Sehe ich genau so. Und nu' kommt mal wieder auf den Boden der Tatsachen zurück. Vor dem nächsten Posting einfach dreimal durchatmen und sich fragen, ob das die Sache wirklich wert ist.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  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 10:41 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