Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - create und free von Objekten
Gausi - Fr 07.03.03 19:12
Titel: create und free von Objekten
Hab mal ne Frage zu free:
Ich habe eine Personenliste. Eine neue Person erstelle ich mit
und setze dann die entsprechenden Eigenschaften der Person.
Jetzt enthält der Datentyp Person auch eine weitere Liste, Urlaubstage. Diese Liste erstelle ich unmittelbar nach dem erzeugen der Person mit
neu.urlaubsliste:=tstringlist.create;.
Wenn ich jetzt eine Person mit
wieder lösche, ist dann auch der Speicher, der für die Urlaubsliste benötigt worden ist, wieder frei, oder ist der weiterhin belegt?
Delete - Fr 07.03.03 19:24
Schreib dir einen Destructor für die Klasse "neu" und gibt dort die Stringliste wieder frei.
Übrigens sehr aussagekräftig der Klassenname "neu". :wink:
Klabautermann - Fr 07.03.03 19:33
Titel: Re: create und free von Objekten
Hallo,
| Gausi hat folgendes geschrieben: |
| ist dann auch der Speicher, der für die Urlaubsliste benötigt worden ist, wieder frei, oder ist der weiterhin belegt? |
der ist dann immernoch belegt, und da du keine Referenz mehr drauf hast, wird es dir schwerfallen den noch zu löschen.
Luckie gibt den richtigen Weg vor, erzeuge das unterobjekt im Construktor deiner Klasse und gebe es im Destruktor wieder Frei. Damit hast du es dann sauber gelöst und musst dich in deinem HAuptcode nciht mehr drum kümmern, kannst dich also auf's wesentliche konzentrieren.
Gruß
Klabautermann
Gausi - Fr 07.03.03 19:49
Dann werd ich mich wohl mal mit diesem Thema genauer beschäftigen.
Aus der Hilfe hab ich mir ungefähr sowas gebastelt
Quelltext
1: 2: 3: 4:
| destructor person.frei; begin urlaubsliste.Free; end; |
kommt das hin, oder mach ich da was falsch? Muss ich die anderen Werte auch irgendwie freigeben (z.b. Name, alter usw.)
Wenn wir schon dabei sind, dann wärs doch bestimmt auch sinnig, wenn ich einen entsprechenden Constructor schreibe, oder?
(Aber: neu ist kein Klassenname, sondern eine Variable vom Typ Person, und wenn ich bisher nix grundlegendes falsch verstanden hab, dann ist das nur ein Zeiger auf die entsprechende Person. Und nach beenden der Prozedur PersonErstellen wird der nicht weiter benötigt, weil ich dann über den Index in der Personenliste an die Person komme...)
Klabautermann - Fr 07.03.03 20:02
Hallo Gausi,
also Prizipiel solltest du deinen Constructor
Create und deinen Destructor
Destroy nennen.
Desweiteren sollsen sie mindestens die Parameter entgegennehmen die der Construktor und Destruktor der Vorfahrklasse hatte (also dessen wo tPerson von abgeleitet ist). Da du dieses ja auch erzeugen musst.
Das bringt mich zu Punkt drei. Deine Klasse ist immer von einer anderen Abgeleitet (und sei es tObject) diese bringt schon eine menge funktionen mit und deklariert sich vieleicht auch unterobjekte. Also musst du sicherstellen, das deren Construktor aufgerufen wird
bevor du etwas in deiner Klasse macht und deren Destruktor aufgerufen wird
nachdem du alles gemacht hast. Denn diese vorfahrklasse ist das Fundament auf dem du Arbeiten musst.
Du kannst funktionen des vorfahren mit dem schlüsselwort
Inherited [funktionsname mit parametern]
aufrufen. Wenn du den Funktionsnamen und die Parameter weglässt, wird die funktion aufgerufen, die genauso heißt wie die aktuelle und auch die selben Parameter verlangt.
Das ganze sollte also so aussehen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| constructor tPerson.Create; begin inherited; urlaubsliste := tStringList.Create; end;
[...]
destructor tPerson.Destroy; begin urlaubsliste.Free; inherited end; |
Gruß
Klabautermann
Gausi - Fr 07.03.03 20:18
Danke!
:oops:
Ist mir fast n bissel peinlich, das sich andere so intensiv mit meinen Problemen auseinandersetzen. Man kann es wohl gar nicht oft genug sagen: Diese Forum ist klasse!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!