![]() |
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:
wie siet das aber hier aus:
procedure TForm1.Button1Click(Sender: TObject);
var list: TStringList; begin list := TStringList.Create; {...} list.Free; end;
Delphi-Quellcode:
brauche ich hier Constructoren bzw Deconstructoren?
function TForm1.Beispiel1(list: TStringList): Integer;
function TForm1.Beispiel2: TStrinList; und ist das hier richtig: :gruebel:
Delphi-Quellcode:
ich danke schon mal für eure antworten^^
procedure TForm1.Button1Click(Sender: TObject);
var list1, list2: TStringList; begin list1 := TStringList.Create; list2 := list1; {...} list2.Free; end; mfg.dominik |
Re: Verwendung von Constructor und Destruktor
Delphi-Quellcode:
ich nehme an das es zu ner AccessViolation kommt da list2 keinen Speicher reserviert bekommt.
list2 := list1
Musst die liste schon erstellen damit sie speicher hat. so long |
Re: Verwendung von Constructor und Destruktor
Zitat:
Im 2. Fall mußt du den Construktor aufrufen, aber keinesfalls den Destruktor (nicht Dekonstruktor). Zitat:
Was willst du hiermit erreichen? [Edit: Zitat:
|
Re: Verwendung von Constructor und Destruktor
Delphi-Quellcode:
Hier muss Result mit TSomeClass.Create erzeugt werden.
function ReturnSomeInstance: TSomeClass;
Delphi-Quellcode:
Hier sollte Instance bereits beim Aufrufen erzeugt sein.
procedure SomeVarInstance(var Instance: TSomeClass);
Delphi-Quellcode:
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.
procedure SomeOutInstance(out Instance: TSomeClass);
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... ;-) |
Re: Verwendung von Constructor und Destruktor
Zitat:
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. |
Re: Verwendung von Constructor und Destruktor
Zitat:
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; |
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. |
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. |
Re: Verwendung von Constructor und Destruktor
Zitat:
Zitat:
Zitat:
also sind bis auf das speicherleck alle functionen korrekt und richtig freigegeben? |
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; |
Re: Verwendung von Constructor und Destruktor
Zitat:
|
Re: Verwendung von Constructor und Destruktor
Moin mkinzler,
Zitat:
@Dominik: Dadurch komme ich gerade auf etwas: Hierdurch:
Delphi-Quellcode:
erzeugst Du eine TStringList, die Du später mit list.free wieder freigibst.
list := Neu;
Hierdurch: label2.Caption := Neu[1]; erzeugst Du wieder eine TStringList, die Du aber nie wieder freigeben kannst, da Du Dir keine Referenz darauf merkst. => Speicherleck |
Re: Verwendung von Constructor und Destruktor
Zitat:
hmm... ist das falsch? die function Neu gibt ja ne TStringList zurück... und darauf kann ich doch mit nem Index drauf zugreifen. ich weiss nur nicht ob ich die dann wieder freigeben muss (wie geht das eigendlich in diesem beispiel?) Zitat:
|
Re: Verwendung von Constructor und Destruktor
Zitat:
|
Re: Verwendung von Constructor und Destruktor
Moin Dominik,
Zitat:
Es geht nur darum mit der übergebenen Instanz der Klasse zu arbeiten, und das geht, wie mkinzler ja schon ausgeführt hat. |
Re: Verwendung von Constructor und Destruktor
ok, nochmal danke @ all
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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 by Thomas Breitkreuz