Autor Beitrag
Mike_C
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: Sa 25.10.03 14:36 
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

ausblenden 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
ausblenden 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

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Mike_C Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: 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

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.

_________________
Ist Zeit wirklich Geld?