PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Heap->QT nimmt delete ab?



Mat
14-01-2006, 21:47
Hallo,
wenn ich OBjekte auf dem Heap anlege...muss ich die von Hand wieder mit delete löschen ? Oder nimmt mir die arbeit QT ab ? Wohl nicht oder ?

peschmae
14-01-2006, 22:14
Ein QObject bzw. ein Objekt einer davon abgeleiteten Klasse löscht all seine Child-Objekte wenn es selbst gelöscht wird.

D.h. die Antwort ist je nach dem. Ein "frei" hängendes Objekt musst du löschen. Ein Button in einem Dialog z.B. nicht, bevor du den Dialog löschst.

Das bedeutet btw auch dass die Child-Objekte des betreffenden QObjects besser nicht auf dem Stack liegen, weil ein Delete darauf angewendet...

MfG Peschmä

Mat
14-01-2006, 22:34
wenn ich also einen validator anlege mit new in einem konstruktor oder einer methode...
wo gebe ich dann den wieder frei ? Im Destruktor der KLasse ? Oder da wo das Programm beendet wird in ner ganz anderen KLasse ?

peschmae
14-01-2006, 23:22
Das kommt drauf an. Sobald du ihn nachher nicht mehr benötigst.

Wenn du das im Konstruktor anlegst dann ist es oft auch sinnvoll das im Destruktor der gleichen Klasse wieder zu löschen.

MfG Peschmä

locus vivendi
15-01-2006, 11:12
Das bedeutet btw auch dass die Child-Objekte des betreffenden QObjects besser nicht auf dem Stack liegen, weil ein Delete darauf angewendet...
Aber QObjects entfernen sich aus der Liste der Child-Objects ihres Parents wenn sie zerstört werden. Wenn man Children nach ihren Parents auf dem Stack anlegt, ist das also unproblematisch.

peschmae
15-01-2006, 12:43
Der Satz oben ist vielleicht etwas merkwürdig, aber ich wollte eigentlich sagen dass ein QObject zu dem Zeitpunkt, zu dem es gelöscht wird, keine Child-Objekte auf dem Stack mehr haben sollte.
d.h. die müssen vorher weg sein

Wann man die anlegt sollte eigentlich egal sein.

MfG Peschmä

Mat
15-01-2006, 14:13
hmm dnake für die antworten...ich habe dennoch eine frage sorry...

ist z.B ein QValidator ein QOBject ? Oder ein QTableItem ?
Weil die erstelle ich im Konstruktor ...und bis jetzt habe ich sie nirgendwo deleted.....

locus vivendi
15-01-2006, 14:37
hmm dnake für die antworten...ich habe dennoch eine frage sorry...

ist z.B ein QValidator ein QOBject ? Oder ein QTableItem ?
Das kannst du am besten in der Referenz-Doku nachschauen. QValidator: Ja, in QT4 zumindest. QTableItem habe ich jetzt nicht geguckt, weil es in QT4 nicht mehr zu geben scheint.


Weil die erstelle ich im Konstruktor ...und bis jetzt habe ich sie nirgendwo deleted....
Wo du die anlegst ist im Prinzip egal. Wichtig ist, dass sie Child-Objekte von irgendeinem anderen QObject werden (welche natürlich auch zu einem geeigneten Zeipunkt zerstört werden muss). Und sie müssen natürlich wenn der Parent zerstört wird "delete"-bar sein, was Peschmae ja schon gesagt hat.

Übrigens, wenn du ein Widget programmierst, brauchst du nicht alle Child-Widgets per "new" anlegen. Du kannst sie auch direkt Member deiner Widget-Klasse machen. (Wenn du nicht gerade noch andere Anforderungen hast, zum Beispiel, dass manche Child-Widgets vorzeitig zerstört werden sollen).

peschmae
15-01-2006, 14:42
Ja klar sind das QObjects, das steht übrigens auch in der Doku. ;)

Aber das QTableItem hat wohl das Table als Parent - also musst du das wohl gar nicht selber löschen.

Ich frag mich gerade wie ich 5 Minuten gebraucht hab um zwei Zeilen zu schreiben :D

MfG Peschmä