![]() |
Oject neu instanzieren ohne vorher zu deinstanzieren
Hi,
was passiert eigentlich, wenn ich ein Object mit gleicher Objectvariable neu instanziere, ohne das alte vorher deinstanziert zu haben? Beispiel: Ich schreibe eine Klasse Txy, die zum Beispiel die Property MyValue hat. Ich möchte beim Start meines Programs diese Property der Klasse Txy mit einem Wert aus einer Ini-Datei belegen, auf den ich während der gesamten Laufzeit des Programms zugreifen kann.
Delphi-Quellcode:
NewXY darf ich ja, soweit ich das richtig verstehe, jetzt nicht deinstanzieren, da ich sonst auch meinen Wert in der Property verlieren würde, oder seh ich das jetzt falsch? Ich würde also hingehen und NewXY deinstanzieren, wenn ich das Programm beende.
ini:= TIniFile.create('Path');
NewXY:= Txy.create; Try NewXY.MyValue:= ini.ReadString('MySection', 'MyIdent', '') Finally ini.free end; Was würde aber nun passieren, wenn ich den Wert für die Property während der Laufzeit ändern wollte und das täte, indem ich den Wert vorher in der Ini-Datei überschreibe und genauso wie in dem Code oben beschrieben wieder der Property neu zuordne? Ich hätte dann ja eine neue Instanz von NewXY ohne die alte deinstanziert zu haben. Oder wird die alte Instanz dann einfach überschrieben? Und bei Programmende alles richtig freigegeben? Oder muss ich zwingend jedesmal die alte Instanz deinstanzieren ehe ich die neue instanziere? Gruß Gambit |
Re: Oject neu instanzieren ohne vorher zu deinstanzieren
Zitat:
|
Re: Oject neu instanzieren ohne vorher zu deinstanzieren
In dem Zusammenhang sollte man vielleicht auch das Stichwort Singleton erwähnen.
|
Re: Oject neu instanzieren ohne vorher zu deinstanzieren
ganz eindeutig ein speicher leck.
das wäre das gleich wie
Delphi-Quellcode:
also das man die instanz gar keiner varialben zu weist. Damit wird zwar die instanz erstellt, somit auch speicher dafür reserviert aber die instanz wird nie verwendet weil man sich nicht sicher an welcher stelle im speicher die instanz gelandet ist.
TIrgendwas.Create;
Wenn du also einfach neu instanzierst schmeist du den Merker der speicheradresse von dem bereits instanzierten object weg. Somit weißt du natürlich auch nicht mehr wo was freigegeben werden muss und es ist ein speicherleck entstanden. Um jetzt irgendwelche unsinnigen Diskusionen zu vermeiden: - Ja ich weiß das ein Object sich auch selbst freigeben kann (also kein pointer auf die instanz benötigt wird) - Ja ich weiß auch das man bei obigen kleinen Beispielcode ein "with" drum herum schreiben kann um somit auf die instanz zu zugreifen.... |
Re: Oject neu instanzieren ohne vorher zu deinstanzieren
Ja, das mit dem Speicherleck hatte ich mir schon gedacht...
Ist es denn zunächste erst einmal richtig gedacht, das Objekt erst mit Programmende zu deinstanzieren, weil ich ja während der gesamten Laufzeit auf die Property zugreifen will? Und wenn die Klasse also mehrere Propertys hat, die alle aus einer Ini-Datei gefüttert werden, muss ich also beim Ändern nur einer Property die gesamten Ini-Datei neu einlesen bzw. alle Propertys neu belegen, weil ich ja auch jedesmal zuerst de- und dann neu instanzieren muss...achne, dass ist ja wohl nun auch wieder falsch gedacht... wenn ich es nun so machen würde:
Delphi-Quellcode:
ini:= TIniFile.create('Path');
if not assigned(NewXY) then newXY:= Txy.create; Try NewXY.MyValue:= ini.ReadString('MySection', 'MyIdent', '') Finally ini.free end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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