QList - wer ist für die Löschung verantwortlich?!

Alles rund um die Programmierung mit Qt
Antworten
MrFox
Beiträge: 5
Registriert: 18. Oktober 2010 22:53

QList - wer ist für die Löschung verantwortlich?!

Beitrag 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.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Etwas weniger Fragezeichen und mehr Informationen zur Version wären hilfreich gewesen, da sich Qt3 und Qt4 in diesem Fall unterscheiden.
MrFox
Beiträge: 5
Registriert: 18. Oktober 2010 22:53

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :P
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
MrFox
Beiträge: 5
Registriert: 18. Oktober 2010 22:53

Beitrag 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.
Antworten