TObjectList
-
Hallo Leute,
ich hab ne Frage zur Verwendung von TObjectList:
TestClass *test = new TestClass (); TObjectList *objList = new TObjectList (FALSE); objList->Add((TObject*) test ); delete objList; delete test;Der obige Code funktioniert wie man es erwartet.
Die ObjectList wird angelegt, mit einer Klasse gefüllt und beim
Löschen muss man selber dafür sorgen, daß das Objekt der Liste gelöscht wird.
Es existiert nach dem Löschen der Liste noch.
Das ist eben das Verhalten im Falle OwnsObjects = FALSE.Instanziiert man aber die ObjectList mit OwnsObjects = TRUE, dann hätte ich
Fehler in der Zeile delete test erwartet, da hier ein Objekt gelöscht
wird, das schon über das delete objList gelöscht worden ist.
Es gibt allerdings die FehlermeldungAccess Violation at address xxx in module 'rtl60.bpl'
für die Zeile delete objList.
Jemand ne Idee, warum das so ist bzw. was ich falsch mache oder falsch
verstanden habe?
-
Ein Zeiger soll auch nur dann gelöscht werden, wenn er noch existiert.
Deshalb sollte man Zeiger mit
if(test)
delete test;löschen. Probier mal, ob der Fehler dann auch noch kommt.
-
Hallo Christian,
vielleicht hab ich mich unklar ausgedrückt.
Im Falle OwnsObjects = FALSE funktioniert das.Für den Fall OwnsObjects = TRUE habe ich das so verstanden, daß ich mich um das Löschen der Elemente in der ObjectList nicht mehr kümmern muss, d.h. nach delete objList sind alle enthaltenen Elemente und auch die objList selber gelöscht.
TObjectList *objList; TestClass *test; test = new TestClass (); objList = new TObjectList (TRUE); objList->Add((TObject*) test ); delete objList;In der letzten Zeile "delete objList" gibt es eine AccessViolation. Die versteh ich nicht.
Viele Grüße
SomeOne
-
Hallo
kann ich nicht nachvollziehen.
bei mir gibt es in diesem testbeispiel keine Exception :TObjectList *objList; TObject *test; test = new TEdit(this); objList = new TObjectList (TRUE); objList->Add(test ); delete objList;Vielleicht hängt das mit deiner TestClas zusammen?
bis bald
akari
-
Hallo akari,
dein Code funktioniert bei mir auch. Von daher ist die Ursache scheinbar schon in meiner Testklasse zu suchen:
class TestClass { private: int irgendwas; public: __fastcall TestClass ( void ) {} __fastcall ~TestClass () {} };Mit dieser TestClass funktioniert der Code nicht:
TObjectList *objList; TestClass *test; test = new TestClass(); objList = new TObjectList (TRUE); objList->Add((TObject*) test ); delete objList;Es gibt eine Access Violation bei "delete objList".
Der Fehler kommt direkt beim Aufruf. Den Destruktor der TestClass kann ich mit dem Debugger nicht erreichen.Any Idea?
SomeOne
-
...daß TObjectList anstelle des Typs Pointer den Typ TObject verlangt. TObjectList enthält eine Eigenschaft OwnsObjects, über welche festgelegt werden kann, ob die Elemente (vom Typ TObject abgeleitete Klassen) freigegeben werden sollen oder nicht.
Deine eigene Klasse ist nicht vom Typ TObjekt. Das casten nach TObjekt ist in diesem Fall "schummel", da OWNSObject fehlt.
-
Hallo Christian,
du hast recht.
Da hab ich wohl geschummelt, ohne es zu wollen.Leitet man die TestClass von TObject ab (ob nun sinnvoll oder nicht), dann funktioniert es.
Herzlichen Dank
SomeOne
-
Christian211 schrieb:
Ein Zeiger soll auch nur dann gelöscht werden, wenn er noch existiert.
Deshalb sollte man Zeiger mit
if(test)
delete test;
löschen.Das ist übrigens Unsinn. Ein delete auf einen NULL-Pointer verursacht keine Fehler.
-
Sorry, ja stimmt, jetzt nicht mehr