Seite 1 von 1
QList mit Zeigern
Verfasst: 1. Oktober 2010 10:23
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?
Verfasst: 1. Oktober 2010 10:30
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.
Verfasst: 1. Oktober 2010 10:37
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.
Verfasst: 1. Oktober 2010 10:38
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.
Verfasst: 1. Oktober 2010 10:41
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!
Verfasst: 1. Oktober 2010 15:46
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.