AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Destruktor für verkettete Liste

Ein Thema von Teesäufer · begonnen am 10. Jan 2021 · letzter Beitrag vom 31. Jul 2021
Antwort Antwort
Seite 1 von 3  1 23      
Teesäufer

Registriert seit: 10. Jan 2021
18 Beiträge
 
#1

Destruktor für verkettete Liste

  Alt 10. Jan 2021, 21:10
Hallo zusammen,

ich bin mit Delphi leider noch nicht so ganz warm geworden. Als ich mir mal ein gutes Buch dazu kaufen wollte waren die alle nicht mehr im Handel. Keine Ahnung, warum.

Auf jeden Fall möchte ich eine verkettete Liste programmieren.

Delphi-Quellcode:
TListe = class
    private
    inhalt: string;
    next: Tliste;
    public
    constructor create(wert: string);
    destructor destroy; override;
    function gibmirinhalt: string;

  end;
Mit dem Destruktor habe ich noch meine Probleme. So sieht er momentan aus:
Delphi-Quellcode:
destructor TListe.destroy;
var loeschzeiger: TListe;
begin
  if next<>nil then
    next.destroy;
  inherited;


end;
Wenn ich das im Debugger verfolge stelle ich aber fest, dass nach dem Destroy die Elemente aber noch vorhanden sind. Was mache ich falsch?

Geändert von mkinzler (10. Jan 2021 um 21:16 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Destruktor für verkettete Liste

  Alt 10. Jan 2021, 21:22
Herzlich willkommen erst mal.

Grundsätzlich musst Du für die Freigabe eines Objektes Obj.Free oder besser FreeAndNil(Obj) aufrufen.
Der Destructor übernimmt dann nur Aufgaben des internen Aufräumens.

Schau mal, ob Dir das schon weiter hilft, ansonsten einfach nochmal fragen...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Teesäufer

Registriert seit: 10. Jan 2021
18 Beiträge
 
#3

AW: Destruktor für verkettete Liste

  Alt 10. Jan 2021, 21:35
Scheint geklappt zu haben, vielen Dank! Und danke auch für die freundliche Aufnahme! Ich bin nur in einem Punkt unsicher: Ich hatte zwei Objekte von TListe, die aber auf dieselben Elemente gezeigt hatten. Als ich den ersten mit Freeandnil freigegeben hatte, stand im Debugger tatsächlich nil, beim anderen stand noch eine Adresse. Hat der dann noch irgendwo ins Nirwana auf ein nichtvorhandenes Objekt gezeigt oder war das Objekt dann doch nicht so richtig gelöscht? Ich will ja nicht den Speicher vollmüllen.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Destruktor für verkettete Liste

  Alt 10. Jan 2021, 22:14
...Als ich mir mal ein gutes Buch dazu kaufen wollte waren die alle nicht mehr im Handel. Keine Ahnung, warum.
Hallo Teesäufer,
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.

Ein exzellentes Fachbuch, welches die verketteten Listen verständlich und praxisbezogen behandelt, kann ich Dir wie folgt empfehlen:
Doberenz, W. und Kowalski, Th.: Borland Delphi 7 - Grundlagen und Profiwissen aus dem Jahr 2003.

Es ist im Zentralen Verzeichnis Antiquarischer Bücher (www.zwab.com) noch recht günstig zu haben:
https://www.zvab.com/servlet/BookDet...-srp1-_-image2

Das Buch ist zwar "alt", aber die vermittelten Kenntnisse sind zeitlos und funktionieren auch bei neueren Delphi-Versionen.
Viel Erfolg!
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (10. Jan 2021 um 22:18 Uhr)
  Mit Zitat antworten Zitat
Teesäufer

Registriert seit: 10. Jan 2021
18 Beiträge
 
#5

AW: Destruktor für verkettete Liste

  Alt 10. Jan 2021, 22:59
Hallo Andreas,

welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.
die portable Version 5.

Ein exzellentes Fachbuch, welches die verketteten Listen verständlich und praxisbezogen behandelt, kann ich Dir wie folgt empfehlen:
Doberenz, W. und Kowalski, Th.: Borland Delphi 7 - Grundlagen und Profiwissen aus dem Jahr 2003.

Es ist im Zentralen Verzeichnis Antiquarischer Bücher (www.zwab.com) noch recht günstig zu haben:
https://www.zvab.com/servlet/BookDet...-srp1-_-image2

Das Buch ist zwar "alt", aber die vermittelten Kenntnisse sind zeitlos und funktionieren auch bei neueren Delphi-Versionen.

Viel Erfolg!
Super, vielen Dank für den Hinweis.

Gruß

Teesäufer
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Destruktor für verkettete Liste

  Alt 11. Jan 2021, 00:11
Die Variablen beinhalten Pointer, die auf einen reservierten Speicherbereich zeigen, in dem die Objektdaten liegen.

Folgendes Beispiel:
Delphi-Quellcode:
var
  Person1, Person2: TPerson;
...
Person1 := TPerson.Create; // hierdurch wird Speicher reserviert und der Pointer weist auf eine Speicheradresse
Person1.Name := 'Max'; // die Daten werden in dem Speicherbereich abgelegt
Person2 := Person1; // die Variable Person2 erhält den gleichen Pointerwert wie Person1 (zeigt also auf die gleiche Stelle)
Person1.Free; // Der Speicherbereich wird wieder freigegeben, "Max" bleibt aber dort stehen und kann ggf. irgendwann wieder überschrieben werden (bis dahin können aber beide Variablen noch mit "Max" arbeiten - sie zeigen halt nur nicht mehr auf korrekt reservierten Speicher)
Person1 := nil; // jetzt kann auf Person1 nicht mehr zugegriffen werden, da diese nicht mehr auf eine Speicherstelle zeigt sondern NULL beinhaltet
Person2 := nil; // setzt auch diese Variable auf NULL - Zugriffe auf beide Variablen führen jetzt zu einem Laufzeitfehler
Das Freigeben und auf NIL setzen, kann man auch mit einem Rutsch erledigen: FreeAndNil(Person1)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#7

AW: Destruktor für verkettete Liste

  Alt 11. Jan 2021, 06:51
Wenn die Liste keine Elementverwaltungsklasse ist, sondern ein Element an sich, muss man sich das erste (oder bei mehrfach verketteten Listen ggf. das letzte) Element irgendwo global merken. Ab dort kann man dann die komplette Liste freigeben, das sollte mit dem eingangs gezeigten Destruktor auch funktionieren (wobei ich statt auf nil zu prüfen und dann Destroy aufzurufen lieber gleich Free verwenden würde, das macht nämlich intern genau das).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Destruktor für verkettete Liste

  Alt 11. Jan 2021, 09:00
Hallo,
Zitat:
Mit dem Destruktor habe ich noch meine Probleme
Ich hatte erst mal ein Problem mit deinem Objekt

TListe würde ich mal TListenEintrag nennen.

Und das Destroy des Listen-Eintrages ist nicht vollständig oder fehlerhaft,
das Next darf ja nicht einfach gelöscht werden (Absicht?).

Die Frage ist immer, wissen die Listeneintrag-Objekte, was sie tun müssen (bei Insert/Delete)
oder gibt es eine übergeordnete Klasse, die die ganze Arbeit macht
und die Listeneintrag-Objekte sind dumme Objekte, die nur die Daten enthalten.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Destruktor für verkettete Liste

  Alt 11. Jan 2021, 09:29
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.
die portable Version 5.
Delphi 5? Wie bist du denn da herangekommen als Neueinsteiger? Die ist uralt. Und legal gibt es auch keine portablen Versionen.

Von daher weise ich an der Stelle mal auf die aktuelle kostenlose Community Edition hin...
https://www.embarcadero.com/de/products/delphi/starter
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Teesäufer

Registriert seit: 10. Jan 2021
18 Beiträge
 
#10

AW: Destruktor für verkettete Liste

  Alt 11. Jan 2021, 21:31
welche Delphi-Version benutzt Du? Bitte trag die in Deinem Profil ein, um gezielte Antworten zu bekommen.
die portable Version 5.
Delphi 5? Wie bist du denn da herangekommen als Neueinsteiger? Die ist uralt. Und legal gibt es auch keine portablen Versionen.
Hallo Jaenicke,

erst mal vielen Dank für die Antworten. Die fand ich im Internet. Ich wollte etwas, was auf einen Stick passt.

Gruß

Teesäufer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:50 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