![]() |
Unterschied Zuweisung Unterelemente / ganzes Objekt
Guten Morgen,
ich frage mich, ob die folgenden Quellcodes intern das gleiche machen:
Delphi-Quellcode:
Wie man sieht, weise ich einmal jedes private Element des Objektes manuell zu und einmal weise ich das gesamte Objekt direkt zu.
type
TObj1 = class(TObject) private Fs: String; Fi: Integer; public s: String read Fs; i: Integer read Fi; end; . . . procedure MyProc(); var obj1,obj2: TObj1; begin obj1:=TObj1.Create(); obj1.Fs:='abc'; obj1.Fi:=1; obj2:=TObj1.Create(); //Der Kasus-Knacktus obj2.Fi:=obj1.Fi; obj2.Fs:=obj1.Fs; obj1.Free; //mache irgend etwas mit obj2 obj2.Free; end; //die andere Prozedur procedure MyProc1(); var obj1,obj2: TObj1; begin obj1:=TObj1.Create(); obj1.Fs:='abc'; obj1.Fi:=1; obj2:=TObj1.Create(); //Der Kasus-Knacktus obj2:=obj1; obj1.Free; //mache irgend etwas mit obj2 obj2.Free; end; Weist Delphi beim Zuweisen eines Objektes auf ein anderes nur den Objektpointer zu, oder kopiert es alle Variablen in das andere Objekt? mfG |
Re: Unterschied Zuweisung Unterelemente / ganzes Objekt
Probier es aus. Weise das Objekt einem anderem zu. Gibt das erste Objekt frei und führe Operationen mit dem zweiten Objekt aus. wenn es zu einer Zugriffsverletzung kommt, wurde nur ein Pointer übergeben, der anch dem Freigeben des ursprünglichen Objektes ins Nirvana zeigt, so dass alle weiteren Operastionen mit dem zweiten Objekt fehlschlagen.
Oder um es kurz zumachen: Zweiteres trifft zu. Esw ird nur ein Zeiger auf das Objekt zugewiesen. Deswegen besitzen manche Klassen eine Assign Methode, um eine Kopie eines Objektes anfertigen zu können. Dazu muüssen die Objekte aber von TPersistant abgeleitet sein, wenn ich mich recht entsinne. |
Re: Unterschied Zuweisung Unterelemente / ganzes Objekt
Es wird lediglich der Objektzeiger zugewiesen. Wenn Du kopieren möchtest, solltest Du von TPersistent ableiten und dessen Methode Assign überschreiben. Auszug aus der Hilfe zu TPersistent.Assign:
Zitat:
|
Re: Unterschied Zuweisung Unterelemente / ganzes Objekt
Das habe ich schon befürchtet.
Einfach nach dem Free vom ersten Objekt mit den Daten weiterzuarbeiten führt ja nicht unbedingt sofort zur Exception. Habe in solchen Fällen schon mehrfach stundenlang gesucht, weil die Exception erst beim Schließen des Programmes auftrat. Bis ich dann festgestellt habe, dass ich mit freigegebenem Speicher gearbeitet habe. In meinem Fall sind die Objekte aber so trivial, dass es ein Overkill wäre, wenn ich eine Assign Methode programmieren würde. Danke für die Hilfe. mfG Edit:
Delphi-Quellcode:
Dieser Code bringt keine Exception.
...
type ... TObj1 = class(TObject) private Fs: String; Fi: Integer; public property s: String read Fs; property i: Integer read Fi; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var obj1,obj2: TObj1; begin obj1:=TObj1.Create(); obj1.Fs:='abc'; obj1.Fi:=1; obj2:=TObj1.Create(); //Der Kasus-Knacktus obj2.Fi:=obj1.Fi; obj2.Fs:=obj1.Fs; obj1.Free; //mache irgend etwas mit obj2 ShowMessage(obj2.s); obj2.Free; end; Edit2: Mein Fehler... Ich hab da natürlich den falschen Quellcode kopiert... Mit dem anderen kommt es in der Tat direkt zur Exception. |
Re: Unterschied Zuweisung Unterelemente / ganzes Objekt
Nun ja, das Anhalten eines Autos ist auch eher trivial, aber trotzdem macht man sich die Mühe ein aufwendiges aber sicheres Bremssystem einzubauen.
Zitat:
|
Re: Unterschied Zuweisung Unterelemente / ganzes Objekt
Der Vergleich mit dem Auto ist ganz treffend. Vor allem in Bezug auf die Erweiterbarkeit hatte ich darüber nachgedacht, die Objekte direkt zuzuweisen. Denn dann müsste ich die Zuweisungen nur an genau einer Stelle durchführen und nicht an zwei.
Da es in dem konkreten Fall um Objekte des gleichen Typs handelt, ist die Funktion ja auch schnell geschrieben. Zu der Exception noch einmal: siehe Edit2 meines letzten Beitrages. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 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