Objekte auf Heap oder Stack
-
Hallo,
ich bin neu in Qt und habe mal eine Frage. Das Qt einen Teil der Speicherverwaltung abnimmt, sprich dass Parents ihre Child-Objekte vom Heap löschen ist mir klar. Allerdings hab ich auch was gelesen, dass man generell keine Qt-Objekte auf dem Stack erzeugen darf. Stimmt das? Dort stand auch was, da sie sonst nicht angezeigt werden, aber ne Begründung hab ich auch nicht gefunden.Schonmal vielen Dank
Lieber Gruß der Qt-Neuling
-
Schau einfach mal in die Standard-Main die ein Gui-Projekt erzeugt, dort ist eigentlich immer ein QIrgendwas aufm Stack - wird das abgeräumt, nimmts alle Childs mit.
-
Also afaik gilt das für Objekte die von QObject abgeleitet sind, und Child eines anderen Objectes sind.
-
sowas solltest du vielleicht vermeiden:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QLabel l("Hallo"); { QHBoxLayout hbl(&w); hbl.addWidget(&l); } w.show(); return a.exec(); }
Aber bevor du mit Qt anfängst sollte dir klar sein das das nicht tut ... ansonsten benutze ich in Klassen jede Menge QIrgendwas Member die nicht per new angelegt sind
-
Danke erst ma für die Infos, das is mir klar.
Ich meine das hier, schaut mal auf dem Screenshot den Text an, dass verstehe ich gar nicht.http://img28.imageshack.us/i/unbenanntwzu.png
Lieber Gruß
Qt-Neuling und schonmal vielen Dank für die Hilfe
-
das "muss jedes blablubb auf dem Heap erzeugt werden" ist eine Vereinfachung - und wie alle Vereinfachung ist sie ungenau. Es ist einfach sauberer nur das "Haupt"widget auf dem Stack und alles anderes über heap laufen zu lassen da dann alles sauber abgeräumt wird sobald das Hauptwidget den Scope verläßt. Es spricht aber nichts dagegen (in irgendwelchen Methoden zB) ein QDialog auf den Stack zu packen, es mit heap-allokierten Zeug zu füllen, zu exec()en und Auszuwerten um zu gewährleisten das alles zusammen am Ende der Methode über den Jordan geht.
-
Ok vielen Dank, dann weiß ich ja bescheid. Mich hat allerdings der Satz iritiert, dass wenn ichs auf den Stack packe, dass die Sachen dann nicht angezeigt werden....Ist also nicht war?
Lieber Gruß Qt-Neuling
-
Naja, das hat mit QT an sich wenig zu tun.
Eher mit der Lebenszeit von C++ Objekten.
Wenn du in einer Funktion ein Objekt anlegst auf dem Stack, dann wird das beim verlassen zerstört.
Legst du es auf dem Heap an, dann lebt es weiter, bis dazu ein delete aufgerufen wird (oder der Prozess gekillt wird).
Erzeugst du also im Constructor als bsp ein QPanel und das soll danach noch angezeigt werden, musst du es auf dem Heap erzeugen, weil es sonst beim Verlassen des Constructors zerstört werden würde.
Mit Dialogen schaut das anders aus. Diese kann man auf dem Stack erzeugen, weil man nach dem Verlassen der Funktion damit meist fertig ist. Als bsp. ein FileSaveDialog oder ein ColorPicker etc.