Frage

Von der Symbian Welt, ich bin zu mit dem Haufen so weit wie möglich vermieden werde, dass knapp Stapelspeicher, vor allem, wenn Deskriptoren Handhabung. CBase abgeleiteten Klassen wurden immer dynamisch auf dem Heap zugewiesen, da wären sie nicht, ihre Mitgliedsvariablen nicht initialisierte bleiben würde. Hat die gleiche Konvention zu QObject abgeleiteten Klassen gilt?

In Qt scheint es üblich zu sein, zu setzen, zum Beispiel QString, auf dem Stapel. Ist der Zeichenfolge Inhalt auf dem Heap setzen, während QString als Container auf dem Stapel wirkt, oder ist alles Put auf dem Stapel?

War es hilfreich?

Lösung

Wie sje397 sagte: Es ist idiomatische QString und Behälter auf den Stapel zu legen, da sie implizit geteilt werden. Ihre Einbauten (Pimpl Idiom „d“ Zeiger) auf dem Heap erstellt. Es gibt keinen Punkt bei der Erstellung des Objekts selbst auf dem Heap, auch. Speicher-Management-Probleme nur verursacht, und Sie verlieren die beabsichtigten Copy-on-Write-Eigenschaften, wenn sie um Zeiger auf Strings / Container übergeben.

QObjects auf der anderen Seite Sie in fast allen Fällen auf dem Heap erstellt werden soll, da sonst würden sie sofort wieder zerstört werden. Sie können nicht kopiert oder zugewiesen werden (na ja, man es für eigene Unterklassen durchsetzen kann, aber die QObject Semantik ist gebrochen dann), und in der Regel sind sie eigentlich die Methode Körper, um überleben sie erstellt werden. Ausnahme ist QDialog, die häufig auf dem Stapel erzeugt wird, gefolgt von QDialog::exec, die blockiert, bis der Dialog geschlossen. Aber auch das ist streng unsicher gesprochen, als externe Ereignisse (RPC-Aufrufe, Hintergrundoperationen) könnten den Dialog bewirken durch ihre Mutter gelöscht werden (wenn das übergeordnete selbst gelöscht wird), bevor exec zurückkehrt. Dann haben Sie den Dialog auf dem Stapel erstellt werden doppelte Löschung führen, wenn der Stapel Abwickeln -> Absturz.

Andere Tipps

QString und viele andere Qt-Klassen verwenden implizite gemeinsame Nutzung von Daten . Das bedeutet, dass der Speicher im Allgemeinen auf dem Heap zugeordnet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top