Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verwendung von Constructor und Destruktor (https://www.delphipraxis.net/86231-verwendung-von-constructor-und-destruktor.html)

dominikkv 11. Feb 2007 12:34


Verwendung von Constructor und Destruktor
 
hallo

ich hab ein paar fragen wie man .create und .free richtig benutzt.
eigendlich ist es ja klar...:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   list: TStringList;
begin
  list := TStringList.Create;
  {...}
  list.Free;
end;
wie siet das aber hier aus:
Delphi-Quellcode:
function TForm1.Beispiel1(list: TStringList): Integer;
function TForm1.Beispiel2: TStrinList;
brauche ich hier Constructoren bzw Deconstructoren?
und ist das hier richtig: :gruebel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   list1, list2: TStringList;
begin
  list1 := TStringList.Create;
  list2 := list1;
  {...}
  list2.Free;
end;
ich danke schon mal für eure antworten^^
mfg.dominik

p0w3r5tr34m3r 11. Feb 2007 12:38

Re: Verwendung von Constructor und Destruktor
 
Delphi-Quellcode:
list2 := list1
ich nehme an das es zu ner AccessViolation kommt da list2 keinen Speicher reserviert bekommt.
Musst die liste schon erstellen damit sie speicher hat.

so long

mkinzler 11. Feb 2007 12:39

Re: Verwendung von Constructor und Destruktor
 
Zitat:

brauche ich hier Constructoren bzw Deconstructoren?
Im 1. Fall wird existiert die Instanz ja schon, also nein.
Im 2. Fall mußt du den Construktor aufrufen, aber keinesfalls den Destruktor (nicht Dekonstruktor).

Zitat:

und ist das hier richtig:...
Nein, es wird ja nur eie Insanz erzeugt, welche dann freigegeben wird.
Was willst du hiermit erreichen?
[Edit:
Zitat:

ich nehme an das es zu ner AccessViolation kommt da list2 keinen Speicher reserviert bekommt.
Nein es gibt keine AV. Objektvaribalen sind ja Referenzen (Zeiger) auf Objekte. Das heißt beide Variablen referenzieren das selbe objekt.]

DGL-luke 11. Feb 2007 12:44

Re: Verwendung von Constructor und Destruktor
 
Delphi-Quellcode:
function ReturnSomeInstance: TSomeClass;
Hier muss Result mit TSomeClass.Create erzeugt werden.

Delphi-Quellcode:
procedure SomeVarInstance(var Instance: TSomeClass);
Hier sollte Instance bereits beim Aufrufen erzeugt sein.

Delphi-Quellcode:
procedure SomeOutInstance(out Instance: TSomeClass);
Hier solltest du prüfen, ob Instance schon erzeugt wurde (per "if Instance is TSomeCLass" zum Beispiel, es gib da aber leider keine 100%ige Möglichkeit), in der Mehrheit der Fälle sollte es aber von dir zu erzeugen sein.

Wegen deinem letzten Beispiel:

Sowohl List1 als auch List2 sind dann wilde Pointer, die auf eine (die selbe) zerstörte Instanz weisen.

@powerstreamer: folliger blødsint... ;-)

3_of_8 11. Feb 2007 12:47

Re: Verwendung von Constructor und Destruktor
 
Zitat:

Zitat von p0w3r5tr34m3r
Delphi-Quellcode:
list2 := list1
ich nehme an das es zu ner AccessViolation kommt da list2 keinen Speicher reserviert bekommt.
Musst die liste schon erstellen damit sie speicher hat.

Na wo ist das Problem? Es wird TStringList.Create aufgerufen, der Instanzenpointer auf das erzeugte Objekt wird in list1 gespeichert und anschließend nochmal in list2. Das heißt, list1 und list2 zeigen beide auf die gleiche Instanz einer TStringList.

Bei solchen Funktionen, die eine Instanz erzeugen und den Instanzenpointer zurückgeben, muss immer der Caller die Instanz freigeben. Klar, denn wenn der Callee sie freigibt, kann der Caller nichts mehr damit anfangen.

Nebenbei ist eine gute Alternative dazu, eine Klasseninstanz per Parameter zu übergeben, mit der die Prozedur/Funktion dann arbeitet.

dominikkv 11. Feb 2007 13:03

Re: Verwendung von Constructor und Destruktor
 
Zitat:

Zitat von DGL-luke
Sowohl List1 als auch List2 sind dann wilde Pointer, die auf eine (die selbe) zerstörte Instanz weisen.

das war ja auch mein ziel...es ging mir nur darum ob es theorethisch möglich ist (und warum zerstörte instanzen? vor dem .free kann ich doch mit beiden arbeiten?)

ich hab mal nen beispiel gebastelt um zu schauen ob ich den rest verstanden hab :stupid:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   list: TStringList;
begin
  list := TStringList.Create;  // ist das hier optional?
  list := Neu;
  label1.Caption := Erster_Eintrag(list);
  label2.Caption := Neu[1];
  list.Free;
end;

function TForm1.Erster_Eintrag(list: TStringList): String;
begin
  result := list[0];
end;

function TForm1.Neu: TStringList;
begin
  result := TStringList.Create;
  result.Add('Test_abc');
  result.Add('Test_123');
end;

mkinzler 11. Feb 2007 13:08

Re: Verwendung von Constructor und Destruktor
 
Was ist Neu? Wenn das auch ne Stringlist ist, dann ist das Intantiieren von list nicht optional, sondern überflüssig, da eine 2. nicht benötigte Instanz erzeugt wird.
BTW. list kannst du dann ganz weglassen.

3_of_8 11. Feb 2007 13:09

Re: Verwendung von Constructor und Destruktor
 
Der erste Konstruktoraufruf ist nicht optional, er ist sinnlos. Du weißt Speicher zu, den du nicht mehr freigibst. Speicherleck nennt man das.

Nebenbei sind deine Funktionen, die du dir da bastelst relativ sinnlos. Vor allem ErsterEintrag.

dominikkv 11. Feb 2007 13:13

Re: Verwendung von Constructor und Destruktor
 
Zitat:

Zitat von mkinzler
Was ist Neu?

Neu ist eine function...hab sie halt mal "Neu" genannt xD
Zitat:

Zitat von 3_of_8
Der erste Konstruktoraufruf ist nicht optional, er ist sinnlos. Du weißt Speicher zu, den du nicht mehr freigibst. Speicherleck nennt man das.

danke :wink:
Zitat:

Zitat von 3_of_8
Nebenbei sind deine Funktionen, die du dir da bastelst relativ sinnlos. Vor allem ErsterEintrag.

das ist mir schon klar, es geht mir nur ums prinzip^^

also sind bis auf das speicherleck alle functionen korrekt und richtig freigegeben?

Christian Seehase 11. Feb 2007 13:19

Re: Verwendung von Constructor und Destruktor
 
Moin Dominik,

im Prinzip ja, aber es ist grundsätzlich keine gute Idee, ein Objekt als Rückgabewert einer Funktion zu verwenden, da man zu leicht vergessen kann, dass man das auch wieder freigeben muss.

Das sollte man besser so machen, wie Manuel es schon beschrieben hat:

Delphi-Quellcode:
procedure WasAuchImmer(const AslResult : TStringList);
begin
  AslResult.Clear;
  AslResult.Add('erster string');
  AslResult.Add('zweiter string');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Seite 1 von 2  1 2      

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