Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit Desctructor


Mike_C - Sa 25.10.03 14:36
Titel: Problem mit Desctructor
Hi

ich weiß nicht genau, wo mein Problem hingehört, deshalb poste ich es hier rein...

Mein Prob ist folgendes:
ich habe versucht mir einen "Compiler" für eine eigene Script-Sprache zu schreiben. Dazu habe ich eine Klasse TCompiler entworfen, die Aufgaben wie debuggen und Script ausführen übernehmen soll. Der eigentliche Debug-Vorgang funktioniert auch, aber wenn ich den Destructor der Klasse aufrufe, stürtz das Programm mit einer AccessViolation ab.

Mein Descturctor soll nichts weiter machen, als 2 StringLists "zerstören", also deren Destructor aufzurufen.

Daher sieht der Destructor so aus


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
destructor TCompiler.Destroy;
begin
  TempScript.Free;
  FErrorMessages.Free;
  inherited;
end;


Der Aufruf der Compiler-prozeduren zum Debuggen sieht so aus

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TFormMain.DebugScript1Click(Sender: TObject);
var Compiler: TCompiler;
      AScript:  TStringList;
begin
  AScript := TStringList.Create;
  AScript.Text := Memo1.Text;
  Compiler := TCompiler.Create;
  Compiler.CacheScript(AScript); //läd den Text aus dem Memo in eine Stringlist in die Klasse TCompiler
  Compiler.Debug; //untersucht das Script auf Fehler
  MemoErrors.Text := Compiler.ErrorMessages.Text; //Gibt die Errormessages vom Compiler aus.
  Compiler.Free;
  AScript.Free;
end;


Die Frage ist, warum die AccessViolation auftritt...
Wenn ihr den kompletten Quelltext dazu braucht, schreibt mir bitte eine Mail an michael_kirches@gmx.de, dann kann ich euch das zuschicken. Für's Forum ist das glaube ich zu lang.

Gruß
Mike_C


Anonymous - Sa 25.10.03 14:40

Mir fällt spontan folgendes ein:

1. Eine Stringliste ist nicht ersteltt
2. Im der Klasse wird TempScript AScript zugewiesen, was dazu führt dass AScript 2x freigegeben wird.

Am Quelltext erkenne ich keine Fehler


UC-Chewie - Sa 25.10.03 14:41

Lass mal das inherited aus dem Konstruktor raus.
Und prüf vor dem Zerstören der Stringlisten, ob sie nicht schon freigegeben worden sind.


Mike_C - Sa 25.10.03 14:48

obbschtkuche hat folgendes geschrieben:


Im der Klasse wird TempScript AScript zugewiesen, was dazu führt dass AScript 2x freigegeben wird.



Also entweder lag es wirklich daran, dass AScript 2 mal freigegeben wurde oder am inherited im Destructor. Mir ist dabei nur nicht ganz klar, warum die Klasse auch ohne das inherited normal "freigegeben" wird. rufe ich mit inherited nicht normalerweise die überladene Funktion der Elternklasse auf?

danke auf jeden fall


AndyB - Sa 25.10.03 15:21

Wenn deine Klasse TCompiler nicht von TObject abgeleitet ist, hast du ohne das inherited ein Speicherleck aufgemacht. Da du den Speicher nicht freigibst, kann da auch keine AV auftreten.