QT => Speicherverwaltung



  • Ich hätte noch eine Frage zur Speicherverwaltung bei Qt. Im Gegensatz zu "normalen" C++, wo auf "new" verzichtet werden sollte, wird "new" in Qt ja ziemlich intensiv verwendet.

    Ich habe gelesen, das Qt die Speicherverwaltung für erzeugte Objekte übernimmt, wenn diese mit Parent erzeugt wurden. Soweit so gut, aber wie steht das mit diesem Beispiel aus der Qt-Doku im Einklang?

    QWidget *firstPageWidget = new QWidget; // Parent??
        QWidget *secondPageWidget = new QWidget;
        QWidget *thirdPageWidget = new QWidget;
    
        QStackedWidget *stackedWidget = new QStackedWidget;
        stackedWidget->addWidget(firstPageWidget);
        stackedWidget->addWidget(secondPageWidget);
        stackedWidget->addWidget(thirdPageWidget);
    
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(stackedWidget);
        setLayout(layout);
    

    Ich verstehe so etwas:

    QWidget *firstPageWidget = new QWidget(this);
    

    Hier ist die erzeugende Klasse der Parent, aber oben?

    Welche Fallstricke sind hier bei Qt zu beachten?



  • Les dir mal die beschreibung von addWidget durch.
    Bei diesem Aufruf wird der parent gesetzt.

    http://doc.qt.io/qt-5/qstackedwidget.html#addWidget
    http://doc.qt.io/qt-5/qlayout.html#addItem (addWidget ruft bei einem layout intern addItem auf)



  • firefly schrieb:

    Les dir mal die beschreibung von addWidget durch.
    Bei diesem Aufruf wird der parent gesetzt.

    http://doc.qt.io/qt-5/qstackedwidget.html#addWidget
    http://doc.qt.io/qt-5/qlayout.html#addItem (addWidget ruft bei einem layout intern addItem auf)

    Mal übersetzt für mich:

    Durch die Zuweisung, über in diesem Fall "addWidget()", wird intern vermutlich das von QObject geerbte "setParent()" aufgerufen und damit der Besitz übernommen.

    Im Zweifelsfall müsste ich demnach in der Doku nachlesen, ob das der Fall ist oder nicht, um kein Speicherleck zu erzeugen.


  • Mod

    Containerwidgets übernehmen die Parenteigenschaft in Qt, das es anders nicht so gut geht. Du kannst die widgets aber auch erstmal mit new und this als parent erstellen.



  • "Im Gegensatz zu "normalen" C++, wo auf "new" verzichtet werden sollte..."

    Sorry, wenn du solch einen Bullshit wirklich glaubst, solltest du lieber in einer Scriptsprache oder gar nicht Software entwickeln.



  • Was ist am Verzicht auf direktes 'new' Bullshit? 😕



  • Techel schrieb:

    Was ist am Verzicht auf direktes 'new' Bullshit? 😕

    Dass offenbar überhaupt kein C++ Verständnis vorliegt. Statt solcher unbegründeter "Empfehlungen" wäre Weiterbildung eher angebracht. Nicht bös gemeint, aber eigenes Unwissen sollte nicht als Empfehlung weitergetragen werden.



  • picaschaf, dann bilde dich mal weiter 😉



  • Th69 schrieb:

    picaschaf, dann bilde dich mal weiter 😉

    Mache ich ständig, danke. Solche nutzlosen Kommentare kannst du aber gerne stecken lassen.



  • Es ist allgemein bekannt, dass das Verwenden besitzender, roher Zeiger, wie es QT handhabt, höchstgradig fehleranfällig ist.



  • Techel schrieb:

    Es ist allgemein bekannt, dass das Verwenden besitzender, roher Zeiger, wie es QT handhabt, höchstgradig fehleranfällig ist.

    Wobei man bei QT ja ebend den Besitz abgibt. Daher hat man Massenweise new() ohne jemails ein delete zu sehen.

    Aber es müsste auch sowas gehen:

    QPointer<QWidget> example = newQWidget(this)
    

    Dann hat man mehr das Gefühl von modernem C++ 😉



  • Techel schrieb:

    Es ist allgemein bekannt, dass das Verwenden besitzender, roher Zeiger, wie es QT handhabt, höchstgradig fehleranfällig ist.

    Wenn man nicht weiß was man tut, klar. Nichtsdestotrotz hat das Ownership erstmal nichts damit zu tun wie das Objekt erzeugt wurde, um das ging es mir. Qt bietet selbst ausreichend Smartpointer seit min. Qt 3. Mit C++11 gibt es auch was Brauchbares in der Sprache.



  • Nun QT bildet die Strukturen eben als Baum ab. Daher ist es logisch, dass man keine Deletes sieht, weil am Lebensende der Applikation einfach nur die Wurzel des Baumes entfernt wird, die Parents dann ihre Children ebenfalls entfernen.

    Auch wenn das Konzept vielleicht nicht jedem gefällt, kann ich nur sagen, dass ich noch nie Probleme damit hatte. Ich persönlich empfinde QT als wenig fehleranfällig.

    Abgesehen davon sehe ich das wie Techel: 'new' ist aus meiner Sicht nur noch selten von Nutzen ( QT ist hier die Ausnahme ).
    Für fast alle Anwendungsfälle im reinen C++, die mir bisher untergekommen sind, ist einer der Smartpointer die bessere Wahl. Aber das muss jeder selbst wissen.


Log in to reply