[SFML] Dziwny unhandled exception (globalny obiekt czcionki)
Ostatnio zmodyfikowano 2012-10-17 11:31
akwes Temat założony przez niniejszego użytkownika |
[SFML] Dziwny unhandled exception (globalny obiekt czcionki) » 2012-10-17 04:44:17 Coś mi bezczelnie umyka :) #include <iostream> #include <SFML/Graphics.hpp>
class CFont { sf::Font font; public: CFont() { font.loadFromFile( "arial.ttf" ); } sf::Font & GetFont() { return font; } } Font;
class CText { sf::Font font; sf::Text Text; public: CText() { font.loadFromFile( "arial.ttf" ); Text.setFont( Font.GetFont() ); Text.setString( "0" ); } };
int main() { sf::RenderWindow App( sf::VideoMode( 800, 600 ), "SFML works!" ); CText Text; while( App.isOpen() ) { sf::Event ev; while( App.pollEvent( ev ) ) { if( ev.type == sf::Event::Closed || ev.type == sf::Event::KeyPressed ) App.close(); } App.display(); } return 0; }
Wyświetla się okno stworzone przez SFML i konsola. Zamykając okno przez kliknięcie dowolnego klawisza lub iksem od okna SFML zostaje wyrzucony wyjątek. Zamykając przez konsolę takie coś nie ma miejsca. Unhandled exception at 0x77508DC9 (ntdll.dll) in GRPShip.exe: 0xC0000005: Access violation writing location 0x00000014.
Dodając do odpowiednich klas destruktory z niebuforowanym wypisywaniem na ekran ~CFont() { puts( "CFont zostaje zniszczony\n" ); } i ~CText() { puts( "CText zostaje zniszczony\n" ); }
otrzymamy: CText zostaje zniszczony
CFont zostaje zniszczony
Czyli klasa z czcionką jest usuwana dopiero po klasie CText. Jeżeli w klasie CText użyje czcionki z CText::font to wyjątku nie ma. Ktoś ma jakiś pomysł czemu zostaje rzucony wyjątek, oraz jak sprawić aby czcionka trzymana w CFont dzieląca się nią z CText nie wywoływała tego problemu? |
|
DejaVu |
» 2012-10-17 05:10:50 Może DLL-ki nie masz od obsługi czcionek w katalogu roboczym? :) |
|
akwes Temat założony przez niniejszego użytkownika |
» 2012-10-17 10:26:57 No ale jak użyje tego sf::Font z klasy w CText to wyjątek się nie rzuca. Zresztą problem mam w głównym kodzie a to okrojony przykład. W głównym kodzie każdy tekst się rysuje i dopiero przy wychodzeniu z aplikacji jest problem. Więc to chyba nie brak/niekompatybilność dllek.
Tak jakby CText próbowało zwolnić/nadpisać zasoby należące do CFont |
|
DejaVu |
» 2012-10-17 10:47:04 Chciałbym zauważyć, że tworzysz globalny obiekt Font i na tym globalnym obiekcie pracuje Twoja klasa, a nie na tym, który jest w klasie CText. virtual sf::RenderWindow::~RenderWindow()
Closes the window and free all the resources attached to it.
|
Jak okno SFML-a zarządza zasobami - nie wiem. Pewnym jest, że najpierw usuwasz obiekt okna renderującego, a potem dopiero idzie do piachu Twój obiekt globalny Font, co może być przyczyną wywalania się aplikacji. |
|
akwes Temat założony przez niniejszego użytkownika |
» 2012-10-17 11:31:09 Chciałbym zauważyć, że tworzysz globalny obiekt Font i na tym globalnym obiekcie pracuje Twoja klasa, a nie na tym, który jest w klasie CText.
|
Tak wiem, ten lokalny sf::Font był kontrolny. class CText { public: sf::Font font; sf::Text text; CText() { font.loadFromFile( "arial.ttf" ); text.setFont( font ); text.setString( "0" ); } } Text;
Powoduje exception. Jak okno SFML-a zarządza zasobami - nie wiem. Pewnym jest, że najpierw usuwasz obiekt okna renderującego, a potem dopiero idzie do piachu Twój obiekt globalny Font, co może być przyczyną wywalania się aplikacji.
|
No i chyba to jest to. Hm... Cały czas od kiedy się bawię SFMLem trzymałem sobie wszystkie sf::Image a potem sf::Texture w globalnym obiekcie i wszystko ładnie grało a tu taka niespodzianka od sf::Font ;> Zwłaszcza, że w SFML 1.6 zdaje się miałem globalny atlas czcionek. W każdym razie dzięki za pomoc ;D |
|
« 1 » |