AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Verwendung von Constructor und Destruktor
Thema durchsuchen
Ansicht
Themen-Optionen

Verwendung von Constructor und Destruktor

Ein Thema von dominikkv · begonnen am 11. Feb 2007 · letzter Beitrag vom 11. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#1

Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 13:34
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:
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
Dominik
  Mit Zitat antworten Zitat
Benutzerbild von p0w3r5tr34m3r
p0w3r5tr34m3r

Registriert seit: 18. Aug 2003
Ort: Monheim am Rhein
153 Beiträge
 
RAD-Studio 2009 Pro
 
#2

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 13:38
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
Florian Cülter
ich bin ein notorischer alles-klein-schreiber!

der 100. Beitrag nach 3 Jahren 25 Wochen und einem Tag
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 13:39
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.]
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 13:44
function ReturnSomeInstance: TSomeClass; Hier muss Result mit TSomeClass.Create erzeugt werden.

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

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...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 13:47
Zitat von p0w3r5tr34m3r:
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 14:03
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
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;
Dominik
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 14:08
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 14:09
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 14:13
Zitat von mkinzler:
Was ist Neu?
Neu ist eine function...hab sie halt mal "Neu" genannt xD
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
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?
Dominik
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Verwendung von Constructor und Destruktor

  Alt 11. Feb 2007, 14:19
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 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