Fehlerbehandlung in C++



  • Hallo,
    1.
    ich habe aktuell das Problem,
    das mein Programm trotz das ein Fehler festgestellt wurde einfach fortläuft.
    Habe eigentlich gedacht, das ich mithilfe von return; aus der Funktion herausspringen könnte?

    Wie kann ich also wenn ich "manuell" erzwingen möchte das eine Funktion vorzeitig beendet wird dies bewerkstelligen?

    Zudem möchte ich gerne einmal mein Programm testen ob es wirklich Funktioniert, da ich beim Debuggen stets

    warning: HEAP[Programm.exe]:
    warning: Invalid Address specified to RtlFreeHeap( 003D0000, 10063920 )

    Cannot access memory at address 0x0

    Beim Aufruf der Main-Methode erhalte, jedoch dennoch das Programm startet & funktioniert.

    Gruß jens



  • jensa schrieb:

    Hallo,
    1.
    ich habe aktuell das Problem,
    das mein Programm trotz das ein Fehler festgestellt wurde einfach fortläuft.
    Habe eigentlich gedacht, das ich mithilfe von return; aus der Funktion herausspringen könnte?

    Ja, kann man. Return beendet eine Funktion. Ich würde eher mal den Debugger verwenden um zu prüfen ob er wirklich den Fehlerfall wie erwartet behandelt.

    Ganz davon abgesehen würde ich "echte" Fehler in C++ mittels Exceptions, nicht über Returnwerte behandeln. Returnwerte kann der Aufrufer auch "vergessen", bei Exceptions geht dies nicht...

    jensa schrieb:

    Zudem möchte ich gerne einmal mein Programm testen ob es wirklich Funktioniert, da ich beim Debuggen stets

    warning: HEAP[Programm.exe]:
    warning: Invalid Address specified to RtlFreeHeap( 003D0000, 10063920 )

    Cannot access memory at address 0x0

    Beim Aufruf der Main-Methode erhalte, jedoch dennoch das Programm startet & funktioniert.

    So einen Fehler kenne ich persönlich noch nicht, mich würde interessieren ob dieser Fehler auch bei einem ganz einfachen "Hello World"-Programm auftritt (Wenn nein, gibt es ein Problem in deiner Anwendung, vielleicht bei einer Initialisierung einer globalen Variable).

    cu André



  • bzgl. 2.
    vmtl falsch ausgedrückt.

    es ist wohl wahr, das es erst im "startverlauf" des programmierten auftritt.

    #include "Mainwindow.h"
    using namespace AbTab;
    
    	int main( int argc, char *argv[] )
    	{
    		Gtk::Main main( argc, argv );
    		Glib::RefPtr< Gnome::Glade::Xml > refXml;
    		refXml = Gnome::Glade::Xml::create( "../data/basic.glade" );
    
    		MainWindow* window;
    		refXml->get_widget_derived( "LayoutWindow", window );
    		if ( window )
    		{
    			main.run( *window );
    			delete window;
    			window = 0;
    		}
    		else
    		{
    			std::cout << "LayoutWindow konnte nicht geladen werden" << std::endl;
    			return 1;
    		}
    
    		return 0;
    	}
    

    die erste heap meldung kommt beim prüfen von if (window)

    gruß jens



  • Das bereinigt zwar nicht deinen Fehler (Ich kenne die verwendete Bibliothek nicht und rate jetzt auch nicht in das Blaue hinein), ich habe aber dennoch noch Anmerkungen:

    1. Grundsätzlich würde ich Variablen immer initialisieren

    MainWindow* window = 0; // IMHO besser um Fehler zu vermeiden
    

    2. Lokale Variablen, die anschließend nicht mehr verwendet werden, müssen nicht explizit noch auf irgendwelche Initialwerte zurückgesetzt werden.

    delete window;
    window = 0; // Du verwendest window hier nicht mehr, Unnötig (aber auch kein Fehler)
    

    3. Als reine Ergänzung: Ich würde Freigaben, wo möglich Automatisieren (delete kann man so leicht vergessen). Hierzu kannst du dir z.B. mal Smartpointer anschauen (z.B. aus der Boost-Bibliothek, speziell diesen Abschnitt). Gerade der scoped_ptr ist sehr Leichtgewichtig.

    4. Ich gehe jetzt mal davon aus das "refXml->get_widget_derived("LayoutWindow", window)" noch irgendeinen Statuswert zurückliefert, ansonsten hätte ich erwartet, das window als Rückgabe dient. Wenn ja: Hast du diesen mal abgefragt?

    cu André



  • Hallo,
    ja der Rückgabewert ist vom Typ T_WIDGET sprich in meinem Beispiel dann: 0x10022548
    es wird eben einfach geprüft ob das Widget aus dem Glade XML File gelesen werden konnte.

    den tipp mit dem Smartpointer werde ich für ein späteres Projekt einmal im Auge behalten.

    Aber einen konkreten verdacht warum dort ein Heap - Fehler auftritt ist dir auch nicht klar?


Anmelden zum Antworten