QList mit Zeigern

Alles rund um die Programmierung mit Qt
Antworten
delegug
Beiträge: 11
Registriert: 29. Juni 2010 13:43

QList mit Zeigern

Beitrag von delegug »

Guten Tag,

ich habe eine Frage bezüglich qList und Zeigern.
Ich habe eine QList: QList<int*> list

jetzt füttere ich die Liste:

int *a=new int;
a=....?
list.append(a);

Wenn ich jetzt "delete a" mache, was passiert mit dem Pointer in der Liste. Derzeit befindet sich trotzdem noch eine Addresse auf die Zahl in der Liste.
Wie verhält sich QList mit Pointern?
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Gegenfrage: Wie sollte denn *irgendetwas* in der Liste passieren, wenn du ein delete irgendwo in den Speicher machst?

Frage 2: willst du wirklich Integer newen und als Pointer in der Liste speichern?

Antwort zu deiner Frage: Es passiert natürlich nichts, der Pointer in der QList zeigt weiterhin auf die gleiche Adresse.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Warum sollte QList mitbekommen, dass du dein Objekt zerstörst?
QList hält eine Kopie des Zeigers, der Wert eines Zeigers ist die Adresse auf ein Objekt. Diese Kopie wird ja bei einem delete nicht angefasst. Nach dem delete zeigen alle Kopien des Zeigers auf ein nicht mehr existentes Objekt. Zugriffe erzeugen undefiniertes Verhalten. Bumm.

Du musst dir bewusst werden, wer der Besitzer der Zeiger ist. In deinem Fall ist es wohl der Besitzer der Liste. Deshalb: lass das Löschen außerhalb dieser Klasse.
Außerdem: Warum speicherst du Zeiger auf int? Das bringt keine Performance-Vorteile, im Gegenteil, Allokation im Freispeicher ist teurer, Dereferenzierungen dauern länger. Außerdem ist ein Zeigertyp ungefähr so groß wie ein int (kommt aufs System an), eine Kopie ist also genauso teuer.
delegug
Beiträge: 11
Registriert: 29. Juni 2010 13:43

Beitrag von delegug »

es geht eigentlich darum, was die List mit dem Pointer macht. Nimmt sie nur die Adresse auf oder kopiert sie sich diesen Pointer in einen eigenen Speicherbereich.


Das mit dem int ist schwachsinn, war nur ein Beispiel.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

delegug hat geschrieben:Nimmt sie nur die Adresse auf oder kopiert sie sich diesen Pointer in einen eigenen Speicherbereich.
Wie ich bereits schrieb: Auch Zeiger werden kopiert. Bei Kopien wird der Wert des Objekts in das neue Objekt geschrieben. Der Wert eines Zeigers ist die Adresse auf ein Objekt.
Deshalb ist "nimmt die Adresse auf" und "kopiert diesen Pointer" identisch.
Objekte hinter einem Zeiger werden natürlich nicht kopiert (falls du das meinst). Wäre ja voll gegen den Sinn von Zeigern!
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

wenn deine Pointer auf Objecte Zeigen die von QObject kommen, könntest du dir - falls du an einen vernünftigen Redesign nicht interessiert bis - mal QPointer anschauen ... das sind Qt eigene Pointer die merken wenn das QObjekt auf das sie Zeigen anderswo gelöscht wird und werden dann "invalidiert" ... vernünftiges Design wäre aber mE wohl Sinnvoller.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten