Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mai 16, 2024 18:26

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Sep 07, 2012 14:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
es handelt sich nicht exakt um eine linked list, da das hier theorethisch verzweigt ist, so weit, dass es aber tatsächlich verzweigt ist, bin ich aber noch gar nicht. Das ganze soll übrigens Basis für eine Breitensuche sein, stürzt aber eben nach 7 next ab (aber ausschließlich in Destroy, sonst funktioniert es)
Code:
  1.  
  2. TTurnTreeElement = class
  3.     Turn: TTurn;
  4.     next: TTurnTreeElement;
  5.     upper: TTurnTreeElement;
  6.     constructor Create; overload;
  7.     constructor Create(a: TTurn); overload;
  8.     destructor Destroy; override;
  9.   end;
  10.  

Code:
  1. constructor TTurnTreeElement.Create;
  2. begin
  3.   inherited;
  4.   next:= nil;
  5.   upper:= nil;
  6. end;
  7.  
  8. constructor TTurnTreeElement.Create(a: TTurn);
  9. begin
  10.   inherited Create;
  11.   next:= nil;
  12.   upper:= nil;
  13.   Turn:= a;
  14. end;
  15.  
  16. destructor TTurnTreeElement.Destroy;
  17. begin
  18.   if next <> nil then next.Free;  //hier AccessViolation bei Adresse 0 (lesen);
  19. //wenn ich beim debuggen gerade hier bin (also nicht mit f8 überspringe),  
  20. //öffnet sich ein Assemblerfenster, in dem ich statt code nur ? sehen kann.
  21.   if upper <> nil then upper.Free;
  22.   inherited;
  23. end;

im Übrigen stürzt auch gelegentlich (auch schon bevor ich diese Klasse überhaupt hatte) das Code-Fenster ab, speichern funktioniert aber noch.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 07, 2012 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Prüfung auf nil ist egal, das macht Free schon für dich. Der Grund wird vermutlich sein, dass “self” in der Methode gerade nil ist. Von wo wird der Destruktor aufgerufen (also wie ist der Callstack)?.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 07, 2012 14:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Klingt für mich eher nach nem hängenden Zeiger. Je nachdem was du machst kann next durchaus <> nil sein, aber sich trotzdem kein Objekt mehr dahinter verbergen, und dann knallts beim Zugriff auf das Klassenmitglied Free. Wenn du next also zerstörst, musst du auch dafür sorgen dass es auf NIL gesetzt wird. Es gibt in Delphi übrigens FreeAndNIL, und das macht eben dies (Free setzt nicht auf NIL afair), wobei FreeAndNIL mit Vorsicht zu geniessen ist und eher auf schlechte Codestruktur hindeutet (siehe die Artikel von Allen Bauer zu dem Thema). Je nach Situation kann man damit aber genau solche Probleme verhindern.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 07, 2012 15:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Bei Free knallt auf keinen fall was, denn Free ist ne statische Methode und für alle erben von TObject gleich. Free ruft aber die virtuelle Methode Destroy auf. Die Tatsache, dass der Assembler ? zeigt und die AV bei 0 liegt, weißt darauf hin, dass das auflösen der virtuellen Methode nach 0 ging. Insofern hast du wahrscheinlich sogar eher recht Sascha. Dennoch wäre der Callstack interessant um nachzuvollziehen was passiert.

FreeAndNil hilft halt nich unbedingt. Eigentlich selten ;), weil es ja nur eben diese Instanz des Pointers auf nil setzt.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 07, 2012 19:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Das Problem war tatsächlich, dass ich den Pointer nicht nil gesetzt habe, nachdem ich Free aufgerufen habe. Bin zwar bereits draufgekommen, bevor ich hier reingeschaut habe, aber trotzdem Danke.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 19 Queries | GZIP : On ]