-
如果我在
SDL_Quit()
和结束程序之前未能调用SDL_FreeSurface(sprite)
,我会发生泄漏吗?或者退出总是释放它?如果它崩溃了怎么办?我想知道在它崩溃的情况下,cleanup()
不会被调用。 -
我的清理应该一直在析构函数中吗?没有清理功能,除非我想在游戏中期释放一些纹理?
-
它说向
SDL_FreeSurface()
传递NULL是安全的,我添加了一个NULL检查,但它还是崩溃了。我认为崩溃是因为我需要在SDL_FreeSurface()之后手动将sprite设置为NULL吗? -
它可能是不相关的(似乎没有修复它),但常见问题解答说:"你需要将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();
}