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?
QList mit Zeigern
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.
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.
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.
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.
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.delegug hat geschrieben:Nimmt sie nur die Adresse auf oder kopiert sie sich diesen Pointer in einen eigenen Speicherbereich.
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!
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.