Ошибка сегментации SDL_BlitSurface - PullRequest
0 голосов
/ 08 февраля 2011

Я получаю ошибку сегментации от SDL_BlitSurface в C ++.

, вот код

mainScreen->draw( 0, 0, background, NULL );

(где mainScreen - экземпляр класса Screen) и функция рисованияКласс экрана реализован как

void Screen::draw( float x, float y, Texture* source, SDL_Rect* clip)
{
    SDL_Rect offset;
    offset.x = x;
    offset.y = y;

    if ( source->myimage == NULL ) throw 5;
    if ( this->screen == NULL ) throw 6;

    SDL_BlitSurface( source->myimage, NULL, this->screen, &offset );
}

, а текстура определена следующим образом:

class Texture
{
    public:
    Texture(std::string imagepath);
    ~Texture();

    private:
    SDL_Surface* myimage;
    float width;
    float height;

    friend class Screen;
    //friend void Screen::draw( float x, float y, Texture source, SDL_Rect* clip);
};

и реализована

#include "Texture.h"

Texture::Texture(std::string filepath)
{
    // Initialize the image to NULL to avoid any pointer issues
    myimage = NULL;

    // OPTIMIZED FOR PNGs
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optimizedImage = NULL;

    loadedImage = IMG_Load( filepath.c_str() );
    if ( loadedImage != NULL )
    {
        optimizedImage = SDL_DisplayFormatAlpha( loadedImage ); // Notice no colour keying (use transparent PNGs)
    }

    myimage = optimizedImage;
    SDL_FreeSurface( loadedImage );
    SDL_FreeSurface( optimizedImage );

    if (myimage == NULL)
    {
        // Some kind of error
        throw 4;
    }

}

Texture::~Texture()
{
    SDL_FreeSurface( myimage );
}

Я прошел через область, гдеизображение загружается в класс Texture, и это, кажется, работает нормально.Кроме того, я знаю, что this->screen загружен правильно, так как я использую SDL_FillRect с ним в отдельной функции.

1 Ответ

2 голосов
/ 16 февраля 2011

Не делайте этого:

SDL_FreeSurface( optimizedImage );

Вы не закончили с поверхностью (она назначается myimage).

...