Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Freigabe von lokal erzeugten Objekten (https://www.delphipraxis.net/183092-freigabe-von-lokal-erzeugten-objekten.html)

TiGü 9. Dez 2014 13:49

Freigabe von lokal erzeugten Objekten
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1282734)
Delphi-Quellcode:
...
   wicImage := TWICImage.Create();
...

Wer
Delphi-Quellcode:
Create
sagt, muss auch
Delphi-Quellcode:
Free
sagen! :warn::zwinker:

Der schöne Günther 9. Dez 2014 17:16

AW: Konvertieren eines TBitmap zu einem TPngImage tut später komische Dinge
 
Jaja, vereinfachtes Beispiel und so. ;-)

In Wirklichkeit habe ich immer nach Alister Christie: Escaping the Try...Finally...Free Nest (http://www.youtube.com/watch?v=6Ob8fHtjSZI) lokal einen Speicherwächter der mir beim Verlassen der Methode die lokalen Objekte abräumt.

TiGü 10. Dez 2014 10:24

AW: Konvertieren eines TBitmap zu einem TPngImage tut später komische Dinge
 
Und wie räumst du auf, wenn eine Exception fliegt?

Der schöne Günther 10. Dez 2014 10:51

AW: Konvertieren eines TBitmap zu einem TPngImage tut später komische Dinge
 
Gar nicht, das macht der interface-referenzierte Speicherwächter.

Beispiel:
Delphi-Quellcode:
procedure noMemLeakHere();
var
   memGuard: IMemGuard;
   myLocalObject: TObject;
begin
   myLocalObject := TObject.Create();
   TMemGuard.Guard(memGuard, myLocalObject);

   // Wilde Dinge geschehen jetzt...

   // Wilde Dinge enden jetzt...
end;
Wenn eine Exception auftritt wird geht der Referenzzähler von memGuard auf Null und er wird abgeräumt. Und in seinem Destruktor zerstört er auch
Delphi-Quellcode:
myLocalObject
.

Schau dir das Video am besten mal an, ist Schritt für Schritt super erklärt :thumb:

TiGü 10. Dez 2014 12:12

AW: Konvertieren eines TBitmap zu einem TPngImage tut später komische Dinge
 
Ah, okay...habe nur mit einen halben Auge und ohne Ton drüberspult und mir fiel die Sache ab Minute 18:00 auf.
Wunderte mich das keine MessageBox mit "Three" kam, aber beim zweiten Anschauen mit Ton wird es klar...er kommt ja gar nicht erst zum Create des dritten Objects.

Das ist eigentlich ganz schön clever.
Lohnt sich das auch sonst für nur eine Objekt-Erzeugung?
Ich habe kaum verschachtelte try-finallys in meinen Code (gefunden).

Der schöne Günther 10. Dez 2014 12:21

AW: Konvertieren eines TBitmap zu einem TPngImage tut später komische Dinge
 
Ein Beispiel was ich den Zusammenhang auch immer sehe ist die Sanduhr: Mauszeiger auf Sanduhr setzen, Dinge tun und sich durch diese Technik sicher sein, dass der Cursor, auch im Exception-Fall, automatisch wieder auf "Normal" zurückgesetzt wird.

Ich bin aber kein Freund davon:
Siehe http://www.delphipraxis.net/180596-h...ml#post1260998

Ich benutze es wirklich nur wenn ich mehr als ein Objekt lokal erzeuge und freigeben muss. Gibt neben den beiden sicher noch mehr Anwendungsfälle. :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 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