Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Dziwny unhandled exception (globalny obiekt czcionki)

Ostatnio zmodyfikowano 2012-10-17 11:31
Autor Wiadomość
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 :)

C/C++
#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
C/C++
~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?
P-66967
DejaVu
» 2012-10-17 05:10:50
Może DLL-ki nie masz od obsługi czcionek w katalogu roboczym? :)
P-66968
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
P-66970
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.

C/C++
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.
P-66971
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.

C/C++
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
P-66972
« 1 »
  Strona 1 z 1