如果我在SDL_FreeSurface(sprite)
之前未能拨打SDL_Quit()
并结束程序,我是否会泄密?或者退出总是免费吗?怎么会崩溃?我想知道它崩溃的情况,然后就不会调用cleanup()
。
我的清理是否应该始终在析构函数中?没有清理功能,除非我想在游戏中释放一些纹理?
它表示将NULL传递给SDL_FreeSurface()
是安全的,我添加了一个NULL检查,但无论如何它都会崩溃。我认为崩溃是因为我需要在SDL_FreeSurface()之后手动将sprite设置为NULL?
它可能是无关的,(似乎没有解决它),但FAQ说:“你需要将SDL_INIT_NOPARACHUTE标志传递给你对SDL_Init()的调用,以使msvc调试器工作。” p>
注意:我尽可能使用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();
}
答案 0 :(得分:0)
清理后问题是sprite
非空。更新了修复程序:
void Game::cleanup() {
SDL_FreeSurface(sprite);
sprite = NULL;
SDL_Quit();
}