Seite 1 von 1
QList - wer ist für die Löschung verantwortlich?!
Verfasst: 18. Oktober 2010 23:05
von MrFox
Hallo miteinander,
ich konnte der Qt-Dokumentation bisher nicht entnehmen, ob eine QList mit Pointern diese eigentlich "voll" besitzt, d.h. auch die Objekte löscht, wenn sie selber gelöscht wird. Ein Test meinerseits schuf Klarheit: ja, sie werden gelöscht.
Was ich mich aber dennoch frage: Nehmen wir an ich entnehme der Liste einige Pointer und speichere sie in eine andere QList. Nun lösche ich diese neue QList. Werden dann die Pointer in der alten QList ungültig????
Ein erneuter Test zeigte: nein, die Pointer werden nicht ungültig.
Meiner Ansicht nach ist das aber ein Widerspruch zum ersten Testergebnis!
Also wie verhält sich QList denn nun wirklich per Definition????
Grüße,
Julian S.
Verfasst: 19. Oktober 2010 00:03
von padreigh
Sie werden nicht gelöscht ... das ganze ist dann für dich verlorener Speicher.
Um eine Liste mit Pointern zu löschen musst du sowas machen:
qDeleteAll(liste); liste.clear();
das iteriert über die ganze Liste, ruft für jeden delete auf und das letzte löscht dann den Listeninhalt...
Verfasst: 19. Oktober 2010 09:07
von upsala
Etwas weniger Fragezeichen und mehr Informationen zur Version wären hilfreich gewesen, da sich Qt3 und Qt4 in diesem Fall unterscheiden.
Verfasst: 20. Oktober 2010 21:15
von MrFox
Version ist die 4.6.3.
Padreigh muss ich widersprechen, sie werden gelöscht. Die Destruktoren werden aufgerufen!
Jetzt bin ich aber nur noch neugieriger geworden. Wie ist denn nun das Verhalten in Qt4?
Verfasst: 20. Oktober 2010 21:41
von franzf
Prinzipiell: Die Objekte in einer Liste (ob QList, QVector, std::vector, ..) werden zerstört. Immer! Bei normalen Values bedeutet das, dass der jeweilige Destruktor aufgerufen wird. Und bei einem Pointer heißt es, dass der Pointer zerstört wird - aber nicht das Objekt auf das er zeigt! Auch Pointer sind nur Objekte, die einen Wert haben - die Adresse des Objektes, auf das sie zeigen. Mach dir das klar.
Dein "komisches" Verhalten, dass deine Pointer zerstört werden (sprich du eine Ausgabe des Destruktors siehst) kann ich mir so erklären:
Entweder du verschweigst uns, dass es Pointer auf QObjects sind, die selber wieder children eines Über-QObjects sind, und bei dessen Zerstörung automatisch mitzerstört werden.
Oder du legst Objekte auf dem Stack an und legst dann per Adressoperator einen Zeiger auf das Objekt in die Liste.
Also: Zeig uns dein Testprogramm und wir sagen dir was du falsch machst

Verfasst: 20. Oktober 2010 21:42
von upsala
Nein, wenn ein QList geleert wird, werden die enthaltenen Pointer nicht gelöscht. Den Teil in der Doku kann ich leider gerade nicht finden, aber ein Blick in die Source zeigt es auch, ebenso wie ein kurzer Test.
Verfasst: 20. Oktober 2010 22:08
von MrFox
Ahhhh, danke, mir fällt es wie Schuppen aus den Haaren. Natürlich, die Objekte sind von QObject abgeleitet und werden dann mit der Löschung des Elternelementes gelöscht.
Oh, mann.