AGB  ·  Datenschutz  ·  Impressum  







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

Constructor stürzt mich ins Verderben

Ein Thema von ZahnschleischbluterMurph · begonnen am 25. Feb 2009 · letzter Beitrag vom 25. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
ZahnschleischbluterMurph

Registriert seit: 25. Feb 2009
Ort: Eisenach
3 Beiträge
 
#1

Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 02:13
Hallo zusammen,

ich bin grad am Verzweifeln. Ich habe mehrere Objektlisten und packe da immer kräftig meine Ojekte drauf.

Unit Typen:
Delphi-Quellcode:
Type TTabu = class(TObject)
t:integer;
s:integer;
...
Constructor Create;
end;

Type TTabu_Liste = class(TOjectList)
published function GetItems(i:integer):TTabu
end;

...

implementation

constructor TTabu.Create();
begin
inherited create;
end;

function TTabu_Liste.GetItems(i : integer):TTabu;
begin
result := TTabu(inherited Items[i]);
end;
Soweit so gut. Funktioniert auch alles ganz prima. Ich deklariere die Tabus (Tabu : TTabu, lege einige an (Tabu := TTabu.Create), weise ihnen Werte zu (Tabu.t := 7) und packe sie in die Liste (Tabu_liste.add(Tabu)).

Irgendwann allerdings schmiert das Programm beim Aufruf des Constructors ab. Also nach Tabu := TTabu.Create springt er noch in den Constructor und hängt sich dann auf. Nach ein paar Sekunden kommt dann eine Fehlermeldung 'Zugriffsverletzung bei ...: Schreiben von Adresse ...'.

Das Schlimme ist, dass es irgendwie willkürlich passiert. Wenn ich bspw. beim Typen noch eine variable k: single mit reinstecke, hängt sich das Programme einige Schleifen früher auf. Wenn ich die Objekte nach der Übernahme in die Liste zerstöre, dann hat das nur den Effekt, dass das Programm bei einem anderen Constructor abschmiert.

Hab echt keinen Plan, was da schief läuft und wäre Euch dankbar für Tipps. Kann ich im Constructor etwas ändern?

Eines jedoch vorweg: dynamische Arrays von records sind nicht drin. Damit hatte ich ursprünglich alles gemacht, jedoch war der Speicherbedarf ein wenig zu hoch geworden (wegen ständiger Längenanpassung).

Falls wichtig: ich nutze Delphi 7.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 02:55
was soll das inherited create; ? Und das inherited mit dem Item ? Den TObject-Constructor gibt es zwar, der ist aber leer. Wenn dieser leere Constructor aufgerufen werden soll, dann wenigstens nur mit inherited; Man kanns in dem Fall aber auch sein lassen. Ich lasse es trotzdem allerdings nicht sein, weil die theoretische Möglichkeit besteht, dass zwischen meinem TXYObject und dem Original-TObject noch eine Zwischenschicht reinkommt. Wegen dieser müsste dann nachträglich wohl doch noch inherited; reingeschrieben werden. Allerdings nur das und nicht noch create dahinter. Das ist jedenfalls der einzige Unterschied, den ich an dieser Stelle zu meinem funktionierendem Source sehe. 8)

P.S.: sehe, da steht ja sogar constructor TTabu.Create(); Wozu die () ? Befürchte, dass Delphi sogar dadurch aufs Glatteis gejagt wird.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 04:47
Hm, scheint erst mal alles richtig zu sein. Kannst Du das 'irgendwann' näher definieren (in Anzahl der TTabu Instanzen, die Du erzeugt hast)? Bzw. kannst Du den Code posten, indem Du die Elemente erzeugst und einhängst?
Wegen den Speichergeschichten: Binde FastMM ein.

Grüße,
Uli
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 05:21
Zitat von Hansa:
was soll das inherited create; ? Und das inherited mit dem Item ? Den TObject-Constructor gibt es zwar, der ist aber leer. Wenn dieser leere Constructor aufgerufen werden soll, dann wenigstens nur mit inherited;
Das ist doch egal. Und um genau zu sein geht es z.B. bei variablen Parametern in der überschriebenen Methode gar nicht nur mit inherited;! Deshalb ist das schon völlig richtig, schließlich spricht man damit ja explizit diese Methode in der Elternklasse an.
Zitat von Hansa:
P.S.: sehe, da steht ja sogar constructor TTabu.Create(); Wozu die () ? Befürchte, dass Delphi sogar dadurch aufs Glatteis gejagt wird.
Auch das ist korrekt. Ganz alte Delphiversionen kannten das wohl noch nicht, aber zumindest ab Delphi 6 ist diese Schreibweise bei Methoden ohne Parameter vollkommen normal. Auch ich benutze das oft, weil man damit deutlich Methoden von Eigenschaften und Variablen unterscheiden kann, unabhängig vom Namen.

Was das inherited in GetItems soll, ist mir allerdings nicht klar, denn schließlich gibt es ja kein Items in der neuen Klasse, so dass das ohnehin klar ist, was gemeint ist.

Ich sehe in den geposteten Schnipseln aber erstmal keinen echten Fehler.

Die beschriebenen Effekte deuten jedenfalls auf ein Speicherproblem. Überschriebener Speicher z.B., aber das liegt nicht an dem geposteten Code.
Dass es Fehler gibt, wenn du die erstellten Objekte nach dem Hinzufügen freigibst, ist klar, denn dann sind die ja in der Liste auch kaputt.

Vielleicht hilft es, wenn du versuchst den entsprechenden Code isoliert zu testen bzw. zu kürzen. Wenn das nicht mehr viel Code wäre, in dem dann immer noch der Fehler auftritt, könntest du den dann komplett posten.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 05:30
Constructor Create; virtual; override;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 06:10
Zitat von mkinzler:
Constructor Create; virtual; override;
Erstens muss das override vor dem virtual stehen, zweitens kann man den Konstruktor von TObject nicht überschreiben...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 06:32
Zitat:
zweitens kann man den Konstruktor von TObject nicht überschreiben...
Aber der von TTabu soll das
Markus Kinzler
  Mit Zitat antworten Zitat
ZahnschleischbluterMurph

Registriert seit: 25. Feb 2009
Ort: Eisenach
3 Beiträge
 
#8

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 06:40
Guten Morgen,

schon einmal vielen Dank für die Antworten!

@Hansa: habs irgendwann einmal so gelernt und niemals hinterfragt. Aber gut zu wissen, dass ich mir die Tipperei sparen kann. Hab den überflüssigen Kram rausgeschmissen, aber das hat mein Problem noch nicht gelöst.

@Ulik: Irgendwann klingt fast nach viel, ist es aber nicht. Ich führe 5 Listen und wenn es zum Abbruch kommt, habe ich im Schnitt jeweils rund 20-30 Elemente drin. Aber kurz zu FastMM - war das eine Idee für die dynamischen Arrays?

@jaenicke: Momentan ist der Code noch etwas zu umfangreich, um ihn zu posten, aber ich probiere mal, Deinen Rat mit dem Isolieren umzusetzen, und melde mich im Laufe des Tages!

@mkinzler: ähm, vielleicht stelle ich mich jetzt zu doof an, aber wo muss ich denn 'override' und 'virtual' schreiben?!

Ncoh einmal vielen Dank an alle!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 06:43
Zitat von mkinzler:
Zitat:
zweitens kann man den Konstruktor von TObject nicht überschreiben...
Aber der von TTabu soll das
Probiers aus, AFAIK wirst du override bei einer direkt von TObject abgeleiteten Klasse nicht benutzen können. Beim Desktruktor ja, aber nicht beim Konstruktor.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Constructor stürzt mich ins Verderben

  Alt 25. Feb 2009, 08:47
Zitat von ZahnschleischbluterMurph:
@Ulik: Irgendwann klingt fast nach viel, ist es aber nicht. Ich führe 5 Listen und wenn es zum Abbruch kommt, habe ich im Schnitt jeweils rund 20-30 Elemente drin. Aber kurz zu FastMM - war das eine Idee für die dynamischen Arrays?
Ja, aber generell ist FastMM immer gut (alleine schon wegen der Möglichkeit, sich Speicherlecks anzeigen zu lassen)

Zum eigentlichen Problem: bei den paar Instanzen sollte da eigentlich nichts anbrennen. Versuch mal den Code zu extrahieren, mit dem Du die Instanzen erzeugst und einhängst. Vieleicht sieht man hier was.


Grüße,
Uli
  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 12:39 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