BITTE leg alles was mit GUI und Qt zu tun hat bei Seite und beschäftige dich die nächsten Wochen/Monate mit C++ (Grundlagen, STL, vllt. auch bissl Design Pattern wenn der Rest sitzt)...
Warum?
1) QWidget* widget = new Widget;
erzeugt ein QWidget im Freispeicher
QWidget widget;
erzeugt eines im automatischen Speicher ("STACK").
Im ersten Fall bist du für Speicherbereinigung zuständig, im zweiten geschieht dies automatisch.
2) Speicher freigeben machst du als Anfänger NIE mit dem direkten Aufruf des Destruktors, sondern mit delete! dlg->~Dialog() in deinem Beispiel führt zwar den Code im Destruktor aus, gibt aber dann den Speicher nicht frei -> Memory Leak!
3) Dereferenzieren von Pointern mit operator* ist natürlich eine schöne Sache. Aber per Default (weils einfacher und übersichtlicher ist) nimmst du dafür operator->
Code: Alles auswählen
QWidget* w = new QWidget;
w->show();Wenn du dlg als Member in deiner Klasse ablegst, können alle Methoden und je nach Sichtbarkeit/friends auch andere Klassen auf das Objekt zugreifen. Das wirst du aber nicht wollen.
Sichbarkeit so gering als möglich, sprich in deinem Fall Funktionslokal, dann wird das Objekt am Ende auch brav zerstört, wenn du es im automatischen Speicherbereich ablegst:
Code: Alles auswählen
void MainWindow::on_action_showDialog() {
Dialog dlg;
if( dlg.exec() == QDialog::Accepted ) {
Arbeiten();
}
} // hier ist jetzt dlg automatisch gelöscht, Speicher bereinigt, niemand kann mehr darauf zugreifen