habe eine grundlegende Frage zur Benutzung von QList (und allen ähnlichen containern).
Sei MyObj eine nichttriviale Klasse mit eigenem Speicher auf dem heap, welchen sie z.B. im Konstruktor mit new reserviert und im Destruktor mit delete freigibt.
Nun zur eigentlichen Liste: QList<MyObj> myList;
Wenn ich nun zu myList etwas hinzufügen möchte, habe ich zwei Möglichkeiten: Entweder, ich erzeuge eine MyObj-Instanz auf dem stack und übergebe sie an myList.append():
Code: Alles auswählen
MyObj myobj;
myList.append(myobj);
Code: Alles auswählen
MyObj *myobj = new MyObj;
myList.append(&myobj);
Im ersten Falle dürfte etwas schiefgehen, sobald der Kontext in dem die Instanz erzeugt wurde verlassen wird, und automatisch der Destruktor aufgerufen wird. Denn dann wird der Speicher freigegeben, auf den die kopierte MyObj-Instanz in der Liste noch zugreifen würde.
Im zweiten Fall (wenn ich das Objekt am Ende nicht mit delete lösche) bleibt zwar der dynamische Speicher in der MyObj-Instanz intakt, allerdings dürfte sich ein Speicherleck ergeben, da append() die MyObj-Instanz kopiert. Die ursprüngliche Instanz bleibt im Speicher und der Zeiger darauf geht bei Verlassen des Kontexts verloren.
Wie macht man's richtig? Oder ist QList<MyObj> nur Sinnvoll, wenn MyObj eine einfache Klasse ist, die keinen eigenen dynamischen Speicher hat? Man müsste ja folglich fast immer QList<MyObj*> verwenden, was ich etwas merkwürdig fände, angesichts der Omnipräsenz von QList<QString>, QList<QList<..> >, etc.
Das Verwenden von QList<MyObj*> Wäre jetzt kein Drama, aber gerade in Bezug auf QDataStream &operator<< und allgemeinem handling etwas unpraktischer.
Vielen Dank,
Spinoza