0
  1. SDL_FreeSurface(sprite)如果我没有在我和结束程序之前调用a ,我SDL_Quit()会泄漏吗?还是退出总是释放它?如果它崩溃了怎么办?我想知道在它崩溃的情况下,然后cleanup()不会被调用。

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

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

  4. 它可能不相关,(似乎没有修复它)但常见问题解答说:“您需要将 SDL_INIT_NOPARACHUTE 标志传递给您对 SDL_Init() 的调用以使 msvc 调试器工作。”

注意:我尽可能使用 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();
}
4

1 回答 1

0

清理后问题sprite是非空的。更新修复:

void Game::cleanup() {
    SDL_FreeSurface(sprite);
    sprite = NULL;
    SDL_Quit();
}
于 2012-10-16T00:26:00.853 回答