Speichermanagment Qt



  • Hi

    ich habe da ein verständnisproblem bezüglich der Speicherverwaltung in Qt.
    Wenn ich jetzt eine klasse habe die so aussieht

    class myClass : public QObject
    {
    Q_OBJECT
    public:
        myClass();
    private:
        QNetworkAccessManager* manager;
    };
    

    Bereinigt Qt für mich den 'manager' ? oder muss ich das selber machen?

    danke



  • du musst den destruktor selber schreiben, um dieses objekt freizugeben...
    Außerdem, im contruktor solltestdu ein zeiger (parent) übernehmen, so dass Qt dein destruktor automatisch aufrufen kann...



  • giowck schrieb:

    du musst den destruktor selber schreiben, um dieses objekt freizugeben...

    Okay

    giowck schrieb:

    Außerdem, im contruktor solltestdu ein zeiger (parent) übernehmen, so dass Qt dein destruktor automatisch aufrufen kann...

    Kannst du das näher erläutern?
    bedeutet das dass wenn ich

    class myClass : public QObject
    {
    public:
        myClass(QObject* parent = 0);
    private:
        QNetworkAccessManager* manager;
    };
    
    myClass::myClass(QObject* parent)
    {
        manager = new QNetworkAccessManager(this); // löscht qt für mich das objekt? 
    }
    

    oder brauche ich meinen eigenen destruktor:

    myClass::~myClass()
    {
        delete manager;
    }
    


  • Interessierter schrieb:

    giowck schrieb:

    du musst den destruktor selber schreiben, um dieses objekt freizugeben...

    Okay

    giowck schrieb:

    Außerdem, im contruktor solltestdu ein zeiger (parent) übernehmen, so dass Qt dein destruktor automatisch aufrufen kann...

    Kannst du das näher erläutern?
    bedeutet das dass wenn ich

    class myClass : public QObject
    {
    public:
        myClass(QObject* parent = 0);
    private:
        QNetworkAccessManager* manager;
    };
    
    myClass::myClass(QObject* parent)
    {
        manager = new QNetworkAccessManager(this); // löscht qt für mich das objekt?  
    }
    

    oder brauche ich meinen eigenen destruktor:

    myClass::~myClass()
    {
        delete manager;
    }
    

    leider muss ich schnell weiter. Aber,
    Qt implementiert das "object model", wo ein QObject eine Hierarchie (tree) von child-objekten besitzt. Nun, wenn ein Objekt, welches von QObject erbt, freigegeben wird (z.b. über delete), dann werden auch alle child-objekten freigegeben, automatisch ohne dass du den destruktor der einzelnen objekte manuell aufrufen musst...
    Trotzdem müssen die Destruktoren implementiert werden...
    Wichtig ist halt, dass jedes QObject ein parent hat (also nicht parent = 0).

    class myClass : public QObject
    {
    public:
        myClass(QObject* parent = 0);
    private:
        QNetworkAccessManager* manager;
        QLabel *myLabelWithNoParent;
    };
    
    myClass::myClass(QObject* parent) : QObject(parent)
    {
        manager = new QNetworkAccessManager(this); // löscht qt für mich das objekt? -> JA
        myLabelWithNoParent = new QLabel; // ohne parent, d.h. wird nicht gelöscht 
    }
    
    myClass::~myClass()
    {
        //delete manager; nicht nötig da this parent ist... also automatisch gelöscht...
        delete myLabelWithNoParent; // da parent = 0
    }
    

    das hat gefehlt: myClass(QObject* parent) : QObject(parent)

    ps. noch ein paar links:
    http://library.forum.nokia.com/index.jsp?topic=/Qt_for_Symbian_Developers_Library/GUID-635949BB-775A-48B1-891C-EFF41A96DB0C.html
    http://doc.trolltech.com/4.4/objecttrees.html
    http://stackoverflow.com/questions/2491707/memory-management-in-qt



  • vielen dank giowck!!
    langsam verstehe ich das, wollte dich auch gerade fragen ob du ein paar artikel darüber hast 😃

    danke danke



  • giowck schrieb:

    Trotzdem müssen die Destruktoren implementiert werden...

    Nein, müssen sie nicht. Wenn es nichts zum Zerstören gibt, was manuell erledigt werden müsste, braucht es auch keinen Destruktor.

    Und Widgets sind wieder was eigenes, weshalb dein "QLabel" im Beispiel mehr Erklärung benötigt. Ein Widget liegt üblicherweise als child in einem Layout. Das führt dann schon automatisch zu einer parent<->child Beziehung. Die children werden dann auch gelöscht. Ein Widget als ELement einer non-Gui-Klasse macht auch wenig Sinn, da Widgets nur in einem Layout liegen können. Ein Umsetzen entfernt das Widget aus dem alten Layout. Ist aber jetzt nur ein kleines Problem des Beispiels.



  • l'abra d'or schrieb:

    giowck schrieb:

    Trotzdem müssen die Destruktoren implementiert werden...

    Nein, müssen sie nicht. Wenn es nichts zum Zerstören gibt, was manuell erledigt werden müsste, braucht es auch keinen Destruktor.

    ja, das ist klar denke ich...

    l'abra d'or schrieb:

    Und Widgets sind wieder was eigenes, weshalb dein "QLabel" im Beispiel mehr Erklärung benötigt. Ein Widget liegt üblicherweise als child in einem Layout. Das führt dann schon automatisch zu einer parent<->child Beziehung. Die children werden dann auch gelöscht. Ein Widget als ELement einer non-Gui-Klasse macht auch wenig Sinn, da Widgets nur in einem Layout liegen können. Ein Umsetzen entfernt das Widget aus dem alten Layout. Ist aber jetzt nur ein kleines Problem des Beispiels.

    das stimmt 😃


Log in to reply