Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 07.03.03 18:12 
Hab mal ne Frage zu free:

Ich habe eine Personenliste. Eine neue Person erstelle ich mit
ausblenden Quelltext
1:
neu:=person.create;					

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
ausblenden Quelltext
1:
 neu.free;					

wieder lösche, ist dann auch der Speicher, der für die Urlaubsliste benötigt worden ist, wieder frei, oder ist der weiterhin belegt?

_________________
We are, we were and will not be.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 07.03.03 18: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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 07.03.03 18:33 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 07.03.03 18:49 
Dann werd ich mich wohl mal mit diesem Thema genauer beschäftigen.
Aus der Hilfe hab ich mir ungefähr sowas gebastelt
ausblenden 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...)

_________________
We are, we were and will not be.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 07.03.03 19: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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 07.03.03 19: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!

_________________
We are, we were and will not be.