![]() |
Problem bei TStringlist Freigabe
Hallo erstmal...
Also ich habe ein inzwischen doch umfangreiches Programm geschrieben, weswegen die Fehlersuche noch etwas schwerer wird. Für euch wahrscheinlich auch. Naja ..Also ich hab ein Problem mit dem Freigeben. Zum Aufbau: Ich ein Grundobjekt. In dem kommen wieder Instanzen von anderen objekten vor und in denen nun eine TStringlist. So ich hab nun zu jedem Objekt eine Methode geschrieben, die die (noch manuell) die zuerst mit create erstellten Objekte wieder frei gibt. Das geht auch so weit, nur bei einer Stringlist nicht. dazu mal ein Beispiel
Delphi-Quellcode:
Ich hoffe ihr könnt damit etwas anfangen, aber der Gesamte Code wäre zu groß...denke ich.
TObjekt1=class(TComponent)
Stringlist1:TStringlist; Stringlist2:TStringlist; Stringlist3:TStringlist; public procedure init; procedure makefree; end; TObjekt2=class(TForm); inhalt:TObjekt1; procedure init; procedure beenden; procedure TObjekt1.init; begin Stringlist1:=TStringlist.create; Stringlist2:=TStringlist.create; Stringlist3:=TStringlist.create; end; procedure TObjekt1.makefree; begin Stringlist1.free; Stringlist2.free; //Hier kommt die Zugriffsverletzung Stringlist3.free; end; procedure TObjekt2.init begin inhalt:=TObjekt1.create; inhalt.init; end; procedure TObjekt2.beenden; begin inhalt.makefree; inhalt.free; self.close; end; Schon mal vielen dank im voraus. mfg |
Re: Problem bei TStringlist Freigabe
Probiers mal mit
Delphi-Quellcode:
if Assigned(Stringlist) then
FreeAndNil(StringList);//Oder StringList.Free; |
Re: Problem bei TStringlist Freigabe
Zitat:
An deinem Code kann ich keinen Fehler erkennen. Es gibt die Möglichkeit, dass du erstens irgendwo anders den Speicherbereich der ersten StringList (wahrscheinlich bezieht sich die Fehlermeldung auf die Zeile über dem Cursor) überschreibst oder - zweitens - MakeFree mehrmals aufrufst, das wäre natürlich fatal. Für 1. solltest du die Bereichsprüfung aktivieren, dann kann schonmal nicht mehr so viel schiefgehen. Für 2. reicht es, wenn du einen Breakpoint auf die erste Zeile der Routine setzt und die Vermutung überprüfst. Verhindern kannst du das Problem mit ![]() [add]Pff, ich schreibe zu langsam :P . Zitat:
Delphi-Quellcode:
Das Assigned ist überflüssig, da es schon in TObject.Free überprüft wird.
FreeAndNil(StringList);
Und
Delphi-Quellcode:
wird nie funktionieren.[/quote]
// "Oder"-Teil
if Assigned(Stringlist) then StringList.Free; |
Re: Problem bei TStringlist Freigabe
Schade das von Angel4585 funktioniert nicht..es kommt immernoch "ungültige Zeigeroperation"
|
Re: Problem bei TStringlist Freigabe
Also mit Konstruktor und Destruktor da hab ich immer so meiner Probleme wann override oder sonstwas naja. Deswegen hab ich das mal so gemacht. Die Stringlisten gebe ich nirgendwo anders Frei das steht fest. Das einzige was es noch sein kann ist:
Es gibt ein DLL procedure die auf alles zugreifen kann per zeiger auf das Oberste Objekt. Diese wird immer "ONIDLE" aufgerufen aber nur wenn die Variable initialized auf TRUE steht. Bevor ich aber alles objekte wieder Freigebe und das Programm beende, dann setze ich initialized auf FALSE. Kann es das sein? |
Re: Problem bei TStringlist Freigabe
Ändert das etwas:
Delphi-Quellcode:
[...]
TObjekt1 = class(TComponent)
public Stringlist1:TStringlist; Stringlist2:TStringlist; Stringlist3:TStringlist; constructor Create(AOwner: TComponent) override; destructor Destroy override; end;
Delphi-Quellcode:
Auch noch die Create und Destroy Methoden hinzugefügt.
constructor TObjekt1.Create(AOwner: TComponent);
begin inherited Create(AOwner); Stringlist1:=TStringlist.create; Stringlist2:=TStringlist.create; Stringlist3:=TStringlist.create; end; destructor TObjekt1.Destroy; begin Stringlist1.free; Stringlist2.free; //Hier kommt die Zugriffsverletzung Stringlist3.free; inherited Destroy; end; Florian |
Re: Problem bei TStringlist Freigabe
Moin Zusammen,
nicht zu vergessen inherited beim constructor und destructor aufzurufen... ;-) |
Re: Problem bei TStringlist Freigabe
Hab mal ein Beispiel mit Create und Destroy gepostet.
Die Deklaration von TObject1 habe ich auch geändert. Vielleicht funktioniert es so. |
Re: Problem bei TStringlist Freigabe
Muss nochmal Fragen. Kann man im Konstruktor schon auf alle Variablen des Objektes Zugreifen?
|
Re: Problem bei TStringlist Freigabe
Nach inherited denke ich schon. Auf die selbstdefinierten StringListen erst nach deren Erzeugung mit Create.
Florian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz