Programm bei falscher Klassenverwendung beenden



  • Hallo!

    Ich habe eine Klasse:

    Class::Class(MeinTyp *ptr)
    {
    	assert(ptr); // Klappt, leider nur im Debug
    	ptrMeinTyp = ptr;	
    }
    

    Ich will also darauf bestehen das der ptr gültig ist (bzw. das er nicht 0 ist, gültig muss er ja trotzdem nicht sein), falls nicht soll sich das Programm beenden.

    Wie realisiere ich das im Releasemodus?



  • wieso sollte das nicht funktionieren? vielleicht wird in deinem tesprogramm die entsprechende stelle vom compiler direkt wegoptimiert,sodass dein test im eimer ist 😉



  • Hatte noch c++ assert gegoogelt und mich an einem Beispiel von Volkard orientiert. Dann hatte ich mich gewundert das iM Releasemodus nichts passiert -> wieder bei Volkard geschaut und das gefunden:

    **
    Wenn man die Konfiguration auf "win32 release" stellt, funktioniert assert übrigens nicht. Statt dessen wird eine Zufalls(?)zahl ausgegeben.

    Voklard:Genau so sollte es sein. Das Umschalten auf die Release-Version, also die Auslieferungs-Version soll alle assert-Aufrufe im gesamten Programm ausschalten.**



  • auch grad gelesen. es kann sogar noch schlimmer kommen, da bei manchen definitionen von assert sogar der test selber nichtmehr ausgeführt wird 😕



  • otze schrieb:

    auch grad gelesen. es kann sogar noch schlimmer kommen, da bei manchen definitionen von assert sogar der test selber nichtmehr ausgeführt wird 😕

    Der C++ Standard garantiert dir, dass genau das passiert, falls das Makro NDEBUG gesetzt ist. Das ist ja genau der Witz an Assertions. Während du dein Programm entwickelst dokumentierst und erzwingst du jede Annahme durch ein explizites assert. Wird eine Assertion verletzt crasht das Programm sofort und grausam. Das erleichtert die Fehlersuche, da Abbruchlokation und Fehlerlokation dichter beieinander liegen.
    Dann, nachdem du dein Programm ausführlich getestet hast, baust du die Release-Version. Und in dieser Version werden die Assertions alle automatisch entfernt und kosten somit keinerlei Laufzeit.

    Ob das Deaktivieren aller Assertions sinnvoll ist oder nicht sei mal dahingestellt. Zumindest ist das aber die Motivation hinter dem Standard-Assert (und für dessen Implementation ist das auch der beste Weg).



  • try
    { SomeDangerousFunction();  }
    catch(OutOfMemory)
    {  ExitProgram()  }
    

    Würde das weiterelfen?



  • IFI ManiA schrieb:

    try
    { SomeDangerousFunction();  }
    catch(OutOfMemory)
    {  ExitProgram()  }
    

    Würde das weiterelfen?

    mir scheint, dieser code ist, wenn keiner sonst OutOfMemory fangen mag, äquivalent zu

    SomeDangerousFunction();
    

Anmelden zum Antworten