析构函数上的SDL释放表面失败

时间:2012-10-16 00:10:31

标签: c++ sdl

  1. 如果我在SDL_FreeSurface(sprite)之前未能拨打SDL_Quit()并结束程序,我是否会泄密?或者退出总是免费吗?怎么会崩溃?我想知道它崩溃的情况,然后就不会调用cleanup()

  2. 我的清理是否应该始终在析构函数中?没有清理功能,除非我想在游戏中释放一些纹理?

  3. 它表示将NULL传递给SDL_FreeSurface()是安全的,我添加了一个NULL检查,但无论如何它都会崩溃。我认为崩溃是因为我需要在SDL_FreeSurface()之后手动将sprite设置为NULL?

  4. 它可能是无关的,(似乎没有解决它),但FAQ说:“你需要将SDL_INIT_NOPARACHUTE标志传递给你对SDL_Init()的调用,以使msvc调试器工作。” p>

  5. 注意:我尽可能使用c ++(非c)代码。我找到的答案是使用c代码。

    class Game {
    public:
        #...
    private:
        SDL_Surface* screen;
        SDL_Surface* sprite;
    };
    
    Game::Game()
    {
        done = false;
        sprite = NULL;
        screen = NULL;
    }
    
    Game::~Game()
    {
        if(sprite != NULL){
            cout << "Somehow sprite still exists, freeing now." << endl;
            SDL_FreeSurface(sprite);
        }
    }
    
    bool Game::init(){
        SDL_Init( SDL_INIT_EVERYTHING );    
    
        if((screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF)) == NULL){
            return false;
        }
    
        sprite = SDL_LoadBMP("sprite.bmp");
        if(sprite == NULL) {
            return false;
        }
        return true;    
    }
    
    void Game::cleanup() {
        SDL_FreeSurface(sprite);
        SDL_Quit(); 
    }
    
    int Game::run() {   
        if(init() == false) {
            return -1;
        }
        loop();
        cleanup();
        return 0;
    }
    
    int main(int argc, char *argv[]){
        Game g;
        return g.run();
    }
    

1 个答案:

答案 0 :(得分:0)

清理后问题是sprite非空。更新了修复程序:

void Game::cleanup() {
    SDL_FreeSurface(sprite);
    sprite = NULL;
    SDL_Quit();
}