2016-04-18 13 views
0

Ich entwickle einen einfachen Prototyp mit qt Schöpfer.Valgrind Problem mit QDialog mit Qt Designer

Ich habe Designer verwendet, um meine Fenster zu entwerfen.

Sagen Sie uns, dass das Hauptfenster ein Menü mit einer Option namens "Suspend" hat. Wenn diese Option ausgewählt ist, wird es das Verfahren MainWindow::on_actionSuspend_triggered() deren vereinfachte Implementierung genannt wie folgt fortgesetzt werden:

void MainWindow::on_actionSuspend_triggered() 
{ 
    SuspendDialog suspend_dialog(this); 
    suspend_dialog.setModal(true); 
    auto status = suspend_dialog.exec(); 
    return; 
} 

Die SuspendDialog mit Designer angegeben wurde, wird es von QDialog Klasse abgeleitet und es ist sehr einfach (drei Tasten ein Kombinationsfeld und ein Drehfeld Diese Klasse reserviert keinen Speicher

Jetzt, wenn ich Valgrind in Qtcreator zum Überprüfen der Speichernutzung ausführen, erhalte ich zwei Probleme des Typs Mismatched free()/delete/delete [].Einiges Bizarrus ist, dass die beiden Probleme die gleiche Zeile verweist , die am Ende des Destruktors SuspendDialog ist, dessen Implementierung ist:

SuspendDialog::~SuspendDialog() 
{ 
    delete ui; 
} 

Und das wurde automatisch von Qt Designer generiert.

Meine Frage ist: Ist das ein falscher Positiv von Valgrind oder mache ich etwas falsch?

Vielen Dank im Voraus

+0

die Aufgabe hat nichts mit dem die meisten Tags aber Qt zu tun. Ich dachte auch, ich könnte den Text korrigieren, aber dann entschied ich mich nicht: zu viel. – AlexanderVX

Antwort

1

Durch die unten Sie bitten um Probleme zu tun:

SuspendDialog suspend_dialog(this); // wrong! do not pass 'this' here 

Zeiger Vorbei an ‚this‘ in Qt setzt voraus, dass Sie die übergeordnete Verantwortung für die Freigabe von dass Widget passieren . Oder die Freigabe erfolgt zweimal: zuerst, wenn das Objekt auf dem Stapel zerstört wird und dann, wenn das übergeordnete Objekt zerstört wird.

Wenn Sie den Dialog mit exec() ausführen können Sie den Dialog-Widget auf Stapel zuweisen, aber nicht passieren this es:

SuspendDialog suspend_dialog; 
    // 
    suspend_dialog.exec(); // exec() only 

Oder Sie können den Dialog-Widget im Heap zuweisen und dann können Sie passieren this es:

SuspendDialog* pSuspendDialog = new SuspendDialog(this); 
    // 
    pSuspendDialog->exec(); // or maybe show() depending on task 
+0

Vor allem: Vielen Dank für Ihre Antwort! Ich habe es mit deinem ersten Weg versucht und dies verursacht einen Absturz. Offensichtlich wird das Hauptfenster geschlossen, wenn der Dialog geschlossen wird. Vielleicht ist es wichtig zu beachten, dass die Anwendung Multithread ist. Im Gegenteil, mit der zweiten Methode (mit 'new') funktioniert das perfekt und die Valgrind-Ausgabe wird nicht mehr angezeigt. Ich bin neugierig zu verstehen, warum der erste Weg nicht funktioniert. Ich stimme Ihre Frage ab und ich denke, ich werde es als akzeptierte Antwort markieren. Aber ich werde eine Weile auf andere Antworten warten – lrleon

Verwandte Themen