SDL在析构函数上释放曲面失败


  1. 如果我在SDL_Quit()和结束程序之前未能调用SDL_FreeSurface(sprite),我会发生泄漏吗?或者退出总是释放它?如果它崩溃了怎么办?我想知道在它崩溃的情况下,cleanup()不会被调用。

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

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

  4. 它可能是不相关的(似乎没有修复它),但常见问题解答说:"你需要将SDL_INIT_NOPRACHUTE标志传递给对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();
}

问题是sprite在清理后为非null。更新的修复程序:

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

最新更新