Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Obj. über Construcor übergeben und in priv. Var. speichern (https://www.delphipraxis.net/145807-obj-ueber-construcor-uebergeben-und-priv-var-speichern.html)

scrat1979 8. Jan 2010 17:32


Obj. über Construcor übergeben und in priv. Var. speichern
 
Hallo,

ich übergebe im Constructor einer Klasse ein Objekt. Nun möchte dieses in einer privaten Variable speichern um damit in der Klasse weiterzuarbeiten (andere Proceduren greifen dann über die private Variable darauf zu und verändern z.B. Farben einzelner Zellen).

Diese beiden "Varianten" funktionieren beide problemlos:

1. Version
Delphi-Quellcode:
 construcor Txyz.Create(GridName : TNextGrid);
 begin
   FPrivVariable := GridName;
 end;

2. Version
Delphi-Quellcode:
construcor Txyz.Create(GridName : TNextGrid);
 begin
   FPrivVariable := TNextGrid.Create(nil); // wird im Destruktor freigegeben
   FPrivVariable := GridName;
 end;
Frage: Welche der beiden Varianten sollte man verwenden (Vor- / Nachteile) bzw. warum funktioniert die 1. Version auch, obwohl FPrivVariable gar nicht "erstellt" wurde?

Danke im Voraus,
SCRaT

sx2008 8. Jan 2010 17:41

Re: Obj. über Construcor übergeben und in priv. Var. speiche
 
Die 1. Version ist richtig; die 2. Version erzeugt ein Speicherleck.
>>warum funktioniert die 1. Version auch, obwohl FPrivVariable gar nicht "erstellt" wurde?
Weil der Speicher für das Objekt der Klasse Txyz schon reserviert wurde, bevor der Constructor aufgerufen wird.
Generell ist der Ablauf bei Delphi so:
1.) Speicher für neues Objekt reservieren
2.) Speicher mit Nullen füllen
3.) Constructor aufrufen

scrat1979 8. Jan 2010 17:45

Re: Obj. über Construcor übergeben und in priv. Var. speiche
 
Zitat:

Zitat von sx2008
Die 1. Version ist richtig; die 2. Version erzeugt ein Speicherleck.
>>warum funktioniert die 1. Version auch, obwohl FPrivVariable gar nicht "erstellt" wurde?
Weil der Speicher für das Objekt der Klasse Txyz schon reserviert wurde, bevor der Constructor aufgerufen wird.
Generell ist der Ablauf bei Delphi so:
1.) Speicher für neues Objekt reservieren
2.) Speicher mit Nullen füllen
3.) Constructor aufrufen

Im Prinzip klingt das für mich auch plausibel, ABER: Wenn ich z.B. innerhalb eines Objektes mit einer StringList arbeite und welche nicht durch den Konstruktor übergeben wird, dann muss ich diese ja im Konstruktor auch erstellen, um damit arbeiten zu können und den Speicher im Destruktor wieder freigeben. Warum? Wird der Speicher bei der Übergabe automatisch erzeugt, weil nur eine Referenz übergeben wird? Dann wäre es klar :) Danke!

sx2008 8. Jan 2010 18:10

Re: Obj. über Construcor übergeben und in priv. Var. speiche
 
Objekt-Variablen sind in Delphi Zeiger (Referenzen).
Delphi-Quellcode:
constructor Txyz.Create(GridName : TNextGrid);
begin
  inherited Create; // nicht vergessen!!
  FPrivVariable := GridName;
end;
Das Objekt das im Parameter GridName übergeben wird schon existieren bevor ein Objekt der Klasse Txyz erzeugt wird.
Delphi-Quellcode:
var
  ng : TNextGrid;
  xyz : Txyz;
begin
  ng := TNextGrid.Create();
  xyz := Txyz.Create(ng);
  xyz.Irgendwas();
  ....
  xyz.Free;
  ng.Free; // Reihenfolge ist wichtig
Wichtig ist, dass das Objekt ng aus obigem Beispiel eine längere Lebensdauer als xyz hat!

schöni 8. Jan 2010 18:21

Re: Obj. über Construcor übergeben und in priv. Var. speiche
 
Zitat:

Zitat von sx2008
Objekt-Variablen sind in Delphi Zeiger (Referenzen).
Delphi-Quellcode:
constructor Txyz.Create(GridName : TNextGrid);
begin
  inherited Create; // nicht vergessen!!
  FPrivVariable := GridName;
end;
Das Objekt das im Parameter GridName übergeben wird schon existieren bevor ein Objekt der Klasse Txyz erzeugt wird.
Delphi-Quellcode:
var
  ng : TNextGrid;
  xyz : Txyz;
begin
  ng := TNextGrid.Create();
  xyz := Txyz.Create(ng);
  xyz.Irgendwas();
  ....
  xyz.Free;
  ng.Free; // Reihenfolge ist wichtig
Wichtig ist, dass das Objekt ng aus obigem Beispiel eine längere Lebensdauer als xyz hat!

Das heißt also, das FPrivVariable nur mit dem Wert der Adresse von ng belegt wird, während ng die Anfangsadresse der Objektes und damit des Speicherbereiches ist?

sx2008 8. Jan 2010 19:01

Re: Obj. über Construcor übergeben und in priv. Var. speiche
 
Zitat:

Zitat von schöni
Das heißt also, das FPrivVariable nur mit dem Wert der Adresse von ng belegt wird, während ng die Anfangsadresse der Objektes und damit des Speicherbereiches ist?

Ja. :hi:

scrat1979 8. Jan 2010 21:48

Re: Obj. über Construcor übergeben und in priv. Var. speiche
 
>> Das Objekt das im Parameter GridName übergeben wird schon existieren bevor ein Objekt der Klasse Txyz erzeugt wird.
Dann habe ich es verstanden...

Der Rest ist mir klar :) Vielen Dank nochmals...


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