Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Krzysztof Czaiński 1 Bezpieczeństwo wyjątków w C++: OpenGL Krzysztof Czaiński Opiekun pracy: dr inż. Cezary Stępień

Podobne prezentacje


Prezentacja na temat: "Krzysztof Czaiński 1 Bezpieczeństwo wyjątków w C++: OpenGL Krzysztof Czaiński Opiekun pracy: dr inż. Cezary Stępień"— Zapis prezentacji:

1 Krzysztof Czaiński 1 Bezpieczeństwo wyjątków w C++: OpenGL Krzysztof Czaiński Opiekun pracy: dr inż. Cezary Stępień

2 Krzysztof Czaiński 2 Motywacja Dużo literatury o OpenGL –The Red Book (Addison-Wesley) –http://nehe.gamedev.net/http://nehe.gamedev.net/ Dobrze opisane bezpieczeństwo wyjątków w C++ –Exceptional C++, Herb Sutter OpenGL i wyjątki? –GLT ( )http://www.nigels.com/glt/ –Building an OpenGL C++ Class, Dale Rogerson

3 Krzysztof Czaiński 3 Plan prezentacji Dlaczego wyjątki? –Inne sposoby traktowania błędów Bezpieczeństwo wyjątków w C++ –Gdzie wstawić bloki try / catch, czy coś więcej? OpenGL, a wyjątki Więcej o bezpieczeństwie wyjątków

4 Krzysztof Czaiński 4 Obsługa błędów, czyli problem komunikacji Autor klasy (biblioteki) może wykryć błąd, ale nie wie, co z nim zrobić Użytkownik klasy (biblioteki) wie, co zrobić z błędem, lecz nie potrafi go wykryć Źródło: Materiały ZPR dr inż. Robert Nowaka

5 Krzysztof Czaiński 5 Sposoby traktowania błędów Ignorowanie Zakończenie programu Komunikat dla użytkownika Kod powrotu Zmienna globalna Specjalny stan obiektu Rezerwacja zwracanej wartości Użytkownik może zignorować błąd Kod obsługi wymieszany z innym kodem Obiekt globalny – potencjalne źródło kłopotów Źródło: Materiały ZPR dr inż. Robert Nowaka Wady

6 Krzysztof Czaiński 6 Mechanizm wyjątków a zasoby class A {/*...*/}; void funkcja() { A* a = new A; // Kod rzucający delete a; } void funkcja() { A* a = NULL; try{a = new A; // Kod rzucający delete a; } catch (... ) { delete a; throw; } }

7 Krzysztof Czaiński 7 Zdobywanie zasobów jest inicjalizacją (RAII) Konstrukcja obiektu jest połączona ze zdobyciem zasobu Destrukcja obiektu jest połączona ze zwolnieniem zasobu Gdy obiekt jest lokalny, zasób jest zwalniany automatycznie w momencie niszczenia obiektu

8 Krzysztof Czaiński 8 Sprytny wskaźnik template class AutoPtr { public: explicit AutoPtr( X* p = NULL ) : p_( p ) {} ~AutoPtr() { delete p_; } X& operator*() const { return *p_; } X* operator->() const { return p_; } private: X* p_; };

9 Krzysztof Czaiński 9 Użycie sprytnego wskaźnika class A {/*...*/}; void funkcja() { AutoPtr a( new A ); // Kod rzucający a->metoda(); AutoPtr b = a; // ??? }

10 Krzysztof Czaiński 10 Przykładowy kod z OpenGL void render() { double v[3]; glBegin( GL_TRIANGLES ); for ( int i = 0 ; i < n ; ++i ) { getVertex( i, v ); // rzuca? glVertex3dv( v ); } glEnd(); }

11 Krzysztof Czaiński 11 Automatyczny glBegin/glEnd struct Begin { explicit Begin( GLenum mode ) { glBegin( mode ); } ~Begin() { glEnd(); } }; #include : boost::noncopyable

12 Krzysztof Czaiński 12 Przykładowy kod z bezpiecznymi wyjątkami void render() { double v[3]; Begin( GL_TRIANGLES ); for ( int i = 0 ; i < n ; ++i ) { getVertex( i, v ); // rzuca? OK. glVertex3dv( v ); }

13 Krzysztof Czaiński 13 Przykładowy kod z bezpiecznymi wyjątkami (2) void render() { double v[3]; Begin begin( GL_TRIANGLES ); for ( int i = 0 ; i < n ; ++i ) { getVertex( i, v ); // rzuca? OK. glVertex3dv( v ); }

14 Krzysztof Czaiński 14 Zachowanie stanu OpenGL-a void select() { glRenderMode( GL_SELECT ); // kod rzucający int hits = glRenderMode( GL_RENDER ); //... } Chcemy zagwarantować, żeby po wywołaniu select() OpenGL pozostał w trybie GL_RENDER

15 Krzysztof Czaiński 15 Automatyczny glRenderMode class RenderMode : boost::noncopyable { public: RenderMode( GLenum mode, GLenum restoreMode ) : restoreMode_(restoreMode), restored_(false) { glRenderMode( mode ); } ~RenderMode() { restoreRenderMode(); } GLint restoreRenderMode() { GLint result = 0; if ( ! restored_ ) { restored_ = true; result = glRenderMode( restoreMode_ ); } return result; } private: GLenum restoreMode_; bool restored_; };

16 Krzysztof Czaiński 16 Zachowanie stanu OpenGL-a z auto- glRenderMode void select() { RenderMode x( GL_SELECT, GL_RENDER ); // kod rzucający int hits = x.restoreRenderMode(); //... }

17 Krzysztof Czaiński 17 Co to znaczy bezpieczeństwo wyjątków? Gwarancje bezpieczeństwa wyjątków wg Davea Abrahama: –Podstawowa: Brak wycieku zasobów Wszystkie obiekty pozostają w stanie używalnym, ale nie koniecznie przewidywalnym –Silna: Gdy wystąpi wyjątek, stan programu pozostaje niezmieniony –Nothrow: Nigdy nie rzuca Źródło: GotW #61

18 Krzysztof Czaiński 18 Korzyści Programowanie bezpieczne z uwzględnieniem wyjątków ma istotne zalety: –Użytkownik klasy (biblioteki) może używać mechanizmu wyjątków Wyjątki nie zakłócą pracy programu –W razie niespodziewanego błędu (np. braku pamięci) program może działać dalej Wszelkie zasoby zostają zwolnione mimo wyjątku –Unikamy nie zwolnienia zasobów przez nieuwagę Zasoby są zwalniane automatycznie

19 Krzysztof Czaiński 19 Bezpieczeństwo wyjątków a etap projektowania template class Stack { public: T pop(); //... private: T* tab_; size_t size_; }; template T Stack ::pop() { // assert( size_ > 0 ); return tab_[--size_]; } template T Stack ::pop() { // assert( size_ > 0 ); T result( tab_[size_-1] ); --size_; return result; } template void Stack ::pop( T& result ) { // assert( size_ > 0 ); result = tab_[size_-1]; --size_; }

20 Krzysztof Czaiński 20 Podsumowanie Warto pisać kod w C++ uwzględniając wyjątki i warto uwzględnić to już na etapie projektowania. Dla zainteresowanych polecam: –ZPR, dr inż. Robert Nowak –http://www.gotw.ca/gotw/http://www.gotw.ca/gotw/


Pobierz ppt "Krzysztof Czaiński 1 Bezpieczeństwo wyjątków w C++: OpenGL Krzysztof Czaiński Opiekun pracy: dr inż. Cezary Stępień"

Podobne prezentacje


Reklamy Google