2016-10-05 3 views
1

Ich habe Qt-Anwendung mit Anwendungsklasse:Nach der Initialisierung von Klassenmitglied App stürzt mit SIGSEGV

class Application : public QApplication { 
public: 
    Application(int argc, char** argv); 
    ~Application(); 
}; 

alles funktioniert gut, bis ich

private: 
    const QString NAME = "QtImageViewer"; 

nach, dass die App abstürzt 9 von 10 Mal hinzufügen, wenn ich versuche, laufen sie


Haupt sieht aus wie

int main(int argc, char** argv) 
{ 
    Application app(argc, argv); 
    app.setApplicationName("QtImageViewer"); 

    MainWindow mainWindow; 
    mainWindow.show(); 

    return (app.exec()); 
} 


Ich würde gerne wissen, was los ist, weil ich keine Ahnung habe.

Edit: GDB backtrace Valgrind

+0

muss etwas anderes sein. Die Zeile, die Sie hinzugefügt haben, sollte gut funktionieren. –

+0

[Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) –

+0

@ Jean-FrançoisFabre ja, das ist, was ich mir selbst sagen, h/e ohne diese Zeile, alles funktioniert gut, auch wenn ich Debug ausführen, Breakpoint (Sigsegv) ist bei app.exec(), die nach Logik meines Programms ist – Itha255

Antwort

2

Behoben, dasselbe Problem wie here.

My Application Klassenkonstruktors Signatur ist Application(int argc, char** argv); aber QApplication hat QApplication(int &argc, char **argv)

Changed Application(int argc, char** argv); zu Application(int& argc, char** argv); und alles funktioniert.

Danke an alle für die Hilfe.

+1

Eine zusätzliche Information, die mir in den Sinn kam, könnte für Sie in Zukunft hilfreich sein. Es ist kein Problem mit Qt selbst, aber mit allen Bibliotheken, die Sie verwenden, die auch die Möglichkeit zum Übergeben oder Anfordern von Objekten der Std-Bibliothek bietet, müssen Sie immer darauf achten, dass alle Bibliotheken, die Sie verwenden, gegen die gleiche (oder binärkompatible) Std verknüpft sind Bibliothek als Ihre Anwendung. Vor allem unter Windows wäre dies ein Problem, wenn Qt für eine andere VisualStudio-Version erstellt wurde, als Sie es für Ihre Anwendung verwenden. Unter Linux ist das weniger ein Problem, da Sie normalerweise den Paketmanager weiterleiten. –

0

Ich würde sagen, aber ich habe nicht genug Ruf zum Zeitpunkt des Schreibens dieses Artikels. Zur Erinnerung, ich habe Ihr Repository geklont, mit dem Sie verbunden sind. Ich merke, dass Sie Qt Creator nicht verwenden, aber wahrscheinlich nur cmake verwenden. Meine Qt 5-Installation ist nicht die, in der Sie sich befinden, also habe ich einfach alles in Qt Creator geworfen und das Projekt von dort aus erstellt und ausgeführt.

Das Programm läuft und schließt in Ordnung, auch wenn die Änderung, die Sie vorschlagen, es für Sie bricht. (Built und lief auf Ubuntu 16 mit Qt 5.5 g ++ 5.4.0.)

Außerdem kann ich Igor Kommentar sein Unverständnis, aber da Application auf dem Stapel gemacht wird, ist kein zusätzlicher Haufen Deallokation zu ~Application() eingeführt.

+0

Ihre Antwort hat mich zum Nachdenken gebracht. Schließlich scheint mein Code in Ordnung zu sein. Ich benutze Arch Linux und ich hatte vor kurzem Update für Qt-Bibliotheken und sieht aus, als wäre da etwas kaputt. Gerade getestet App bei VirualBox (Kubuntu 16.04) und alles funktioniert gut. – Itha255

+0

Dass der angegebene Code auf Ihrem oder einem anderen System in Ordnung ist, bedeutet nicht, dass es kein Problem gibt. Doppelt freigewordener Speicher, weiterhin bereits freigegebene Objekte verwenden, ... würde nicht unbedingt zu einem sofortigen Ausfall führen.Abhängig von dem verwendeten Betriebssystem und den verknüpften Bibliotheksversionen oder dem Compiler, der zum Erstellen dieser Bibliotheken oder der Anwendung selbst verwendet wurde, hätten Sie bei einer etwas anderen Verwendung des Speichers diese Unterschiede _heiden_ Probleme auf einem Setup und machen sie daraus _visible_ in einem anderen. Das Problem könnte also immer noch im Code des OP liegen. @ Itha255 –

+0

@ Itha255 Sie löschen in der Tat 'm_pixmapItem', aber ich habe festgestellt, dass es andere gibt, die Sie nicht löschen (dies ist nicht einfach - aber schlecht, aber nicht die Quelle Ihres segfault, da Sie das noch besitzen Speicher bis zum Programmende). Zum Beispiel haben Sie 'm_scene = new QGraphicsScene();' in 'image.cpp' ohne entsprechende Löschung. Dasselbe gilt für 'm_toolBar = new ToolBar();' in 'main_window.cpp'. – orphen

Verwandte Themen