2016-07-13 15 views
0

so bin ich nicht sicher, ob dies einen Fehler in Qt ist oder wenn ich verstehe einfach nicht, etwas, aber ich habe diese Klasse:Qt zwei QList Membervariablen verursacht Crash

class myClass : public QDialog, private Ui::myClass 
{ 
    Q_OBJECT 

public: 
    explicit myClass(QWidget *parent = 0); 

private: 
    QList<ushort> list1; 
    QList<ushort> list2; 
} 

Ich schaffe dieses Fenster indem du auf eine Aktion in einem anderen Fenster klickst:

void mainWindow::on_myClassAction_triggered() 
{ 
    myClass *mc = new mc(NULL); 
    mc->show(); 
} 

So wird es jetzt merkwürdig. Selbst wenn ich list1 und list2 nirgendwo in myClass verwende, stürzt das Programm ab, wenn ich myClass schließe oder manchmal öffne. Wenn ich einen oder beide ausdenke, funktioniert es. Was geht hier vor sich??

+0

Um ehrlich zu sein, ich glaube nicht, dass es etwas mit QList zu tun hat .. ich würde vorschlagen, dass Sie noch mehr Code posten – evilruff

+0

Das ist alles Code, den ich posten muss! Wenn ich im zweiten Block 'myClass * mc = new mc (NULL)' mit 'myClass * mc = new mc (this)' ändere, dann funktioniert alles. Ich glaube, dass es etwas mit dem Löschen der QList zu tun hat, weil der Fehler, der auf den Absturz geworfen wird, HEAP CORRUPTION DETECTED ist. – picklechips

+0

Nun würde ich vorschlagen, Konstruktor zu verfolgen. – evilruff

Antwort

1

Ich benutze Qt Creator. Ich habe QMake gerade neu gestartet und jetzt funktioniert es. Definitiv war eine Art Bug in Qt/Qt Creator.

1

Dies ist kein Fehler. Es ist ein klassisches Problem der binären Inkompatibilität: Sie hatten etwas Code, der vom Layout einiger Ihrer Klassen abhing, aber die veralteten Makefiles erfassten diese Abhängigkeit nicht. Wenn Sie also das Layout der Klasse geändert haben, wurde der abhängige Code nicht neu kompiliert. Es wäre viel zu teuer für qmake, das gesamte Projekt nach solchen Abhängigkeiten zu durchsuchen, jedes Mal wenn Sie es erstellen. Sie müssen qmake erneut ausführen, wenn Sie den Code ändern, um solche binären Inkompatibilitäten einzuführen.

Für kleine Projekte, möchten Sie einfach immer den Code neu erstellen, zwingt einen qmake erneut ausführen.

+0

Ich stimme dir zu, dass es tatsächlich das Problem gibt, das du beschrieben hast (ich stehe fast täglich selbst vor und tue genau das, was du hier vorschlägst), aber ich frage mich immer noch, wie Visual Studio (oder msbuild) alle Abhängigkeiten sofort erkennt und richtig große Projekte in den gleichen Situationen zu bauen. Irgendwelche Ideen? Vielen Dank! – mvidelgauz

+0

Es tut dies, weil es qmake nicht verwendet. Qmake ist nicht wirklich ein Werkzeug für den inkrementellen Einsatz. Cmake wäre eine bessere Wahl. QBS ist wahrscheinlich die beste Wahl: Es leidet nicht an solchen Problemen. –

+0

Vielen Dank für Ihre Antwort! Ich werde versuchen, dieses Thema besser zu lernen (Ich muss ein benutzerdefiniertes automatisiertes Build-System entwerfen und ich hoffe, dass es hilft). – mvidelgauz