AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [Erledigt] Preview Handler in VCL erzeugt MemoryLeak
Thema durchsuchen
Ansicht
Themen-Optionen

[Erledigt] Preview Handler in VCL erzeugt MemoryLeak

Ein Thema von Aviator · begonnen am 16. Feb 2014 · letzter Beitrag vom 31. Mai 2015
Antwort Antwort
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

[Erledigt] Preview Handler in VCL erzeugt MemoryLeak

  Alt 16. Feb 2014, 15:31
Hallo DPler.
Da ich mit meinem Programm sehr viele Dokumente abspeichere und danach natürlich auch wieder anzeigen lassen möchte, habe ich mir überlegt, einen Preview Handler in meinem Projekt mit einzubinden. Ich möchte also Word, Excel, PDF, ... Dateien in meinem Programm per Vorschau anzeigen.

Den Quellcode, wie das denn funktionieren sollte, habe ich von hier. Diese Unit funktioniert auch und macht auch das was es soll.

Ich habe mir zum Testen das Beispielprojekt von dieser Seite heruntergeladen und ausprobiert. Da ich bei meinem neuesten Projekt aber peinlichst darauf achte, dass ich keine Memory Leaks erzeuge, habe ich auch hier nachgeschaut, ob alles sauber wieder freigegeben wird und keine Leaks entstehen.

Also habe ich die Zeile ReportMemoryLeaksOnShutdown := True; in das Beispiel Projekt eingebunden, eine Vorschau geladen und das Programm wieder geschlossen. Ich dachte schon "na super - alles funktioniert wie es soll also kann ich es bedenkenlos benutzen". 10 Sekunden nach der Beendigung des Programms kam dann allerdings die Meldung, dass doch ein MemoryLeak erkannt wurde und das Programm sogar nicht mehr funktionieren würde. (Im TaskManager wird der Prozess auch nach der Beendigung des Programmes angezeigt. Auch wenn ich die Zeile ReportMemoryLeaksOnShutdown := True; weglasse.)

In der Meldung steht, dass eine Instanz des TStreamAdapter nicht freigegeben wurde.

Nun meine Frage: Wie bekomme ich diesen "Fehler" weg bzw. wie lässt sich das umgehen? Ich bin für jede Hilfe dankbar die ich hier bekomme.

Im Anhang noch die Fehlermeldung.
Angehängte Grafiken
Dateityp: png MemoryLeak.png (35,5 KB, 89x aufgerufen)

Geändert von Aviator (16. Feb 2014 um 18:50 Uhr) Grund: Thema als erledigt markiert
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Preview Handler in VCL erzeugt MemoryLeak - Lösung gesucht

  Alt 16. Feb 2014, 15:45
In Zeile 42 ist der Fehler
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Preview Handler in VCL erzeugt MemoryLeak - Lösung gesucht

  Alt 16. Feb 2014, 15:51
In Zeile 42 ist der Fehler
Pro 7?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Preview Handler in VCL erzeugt MemoryLeak - Lösung gesucht

  Alt 16. Feb 2014, 15:54
In Zeile 42 ist der Fehler
Pro 7?
Passt gut gerade
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.905 Beiträge
 
Delphi 12 Athens
 
#5

AW: Preview Handler in VCL erzeugt MemoryLeak - Lösung gesucht

  Alt 16. Feb 2014, 16:24
Er hat den Quelltext doch verlinkt...

Das passiert auch mit der Demo schon. Aber ist wohl zu viel verlangt das auszuprobieren.

In dem Quelltext sind leider zwei gravierende Fehler drin. Der wichtigste ist, dass der TFileStream freigegeben wird, obwohl der TStreamAdapter mit soOwned erzeugt wird. Dadurch gibt es einen Fehler beim Freigeben (logisch) und daher rührt das Speicherleck.

Der zweite wichtige Fehler ist, dass dort der Registry-Schlüssel mit LRegistry.OpenKey(LKey, True); frecherweise einfach erzeugt wird, statt ihn nur zu versuchen zu öffnen und den Rückgabewert auszuwerten.
Richtig daher:
Delphi-Quellcode:
    if LRegistry.OpenKey(LKey, False) then
    begin
      Result := LRegistry.ReadString('');
      LRegistry.CloseKey;
    end
    else
      Result := '';
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Preview Handler in VCL erzeugt MemoryLeak - Lösung gesucht

  Alt 16. Feb 2014, 16:27
Danke Jaenicke, ich versuche mal das Problem mit deinen genannten Hinweisen zu lösen.

@Sir Rufo: Bitte den Beitrag das nächste Mal ganz durchlesen und dann antworten. Danke.
  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:49 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