[Anfängerfrage] Wann werden Objekte in einer Liste freigegeben?



  • Hallo,

    speichere meine Daten in einer QList (http://doc.qt.io/qt-5/qlist.html). In dieser Liste werden Objekte meiner Klasse gespeichert.

    Beispiel:

    QList data<MyClass>;
    
    data.append(MyClass("Argument"));
    

    Mein Problem ist nun folgendes: Sobald ich die Zeile data.append aufrufe, wird für die Klasse MyClass ja Speicher freigegeben. Wenn ich nun den Eintrag später wieder aus der Liste entferne, wir dann auch der Speicher dieser Klasse freigegeben? Ich könnte natürlich auch eine Liste mit Pointern auf meine Klasse erstellen und das dann so machen:

    QList data<MyClass*>;
    
    data.append(new MyClass("Argument"));
    
    //zum löschen und freigeben dann:
    
    delete data[0];
    
    //löscht den Pointer aus der Liste
    data.TakeFirst();
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Frolo schrieb:

    Mein Problem ist nun folgendes: Sobald ich die Zeile data.append aufrufe, wird für die Klasse MyClass ja Speicher freigegeben. Wenn ich nun den Eintrag später wieder aus der Liste entferne, wir dann auch der Speicher dieser Klasse freigegeben? Ich könnte natürlich auch eine Liste mit Pointern auf meine Klasse erstellen und das dann so machen:

    QList data<MyClass*>;
    
    data.append(new MyClass("Argument"));
    
    //zum löschen und freigeben dann:
    
    delete data[0];
    
    //löscht den Pointer aus der Liste
    data.TakeFirst();
    

    Und was würde dann mit dem Zeiger selbst geschehen, wenn deine Theorie korrekt wäre? Dann würde stattdessen dieser irgendwo herum geistern. Nein, stattdessen ist deine Annahme falsch, dass die Container, die dein Framework dir anbietet, nicht einmal simpelste Speicherverwaltung richtig hin bekommen würden. Wiese sollte man jemals einen solchen Container nutzen, wenn sie nicht korrekt funktionierten?

    Konkret im Falle von QList, wird der tatsächlich unterliegende Speicher niemals freigegeben, solange die QList existiert. Die Objekte werden nötigenfalls innerhalb dieses Speichers erzeugt oder zerstört, aber der von der QList verwaltete Speicher wird erst freigegeben, wenn die QList selbst zerstört wird. Wie in der von dir verlinkten Anleitung erklärt wird. Dies ist eine spezielle Eigenart der von dir gewählten Containerklasse.



  • Ein Aufruf von clear() oder eine Zuweisung einer anderen QList gibt den Speicher auch frei. Man muss also nicht zwingend auf den Destructor warten.


Anmelden zum Antworten