C++ 析构函数上的SDL释放曲面失败
如果我在退出()和结束程序之前调用C++ 析构函数上的SDL释放曲面失败,c++,sdl,C++,Sdl,如果我在退出()和结束程序之前调用SDL\u FreeSurface(sprite)失败,我会有漏洞吗?还是退出总是释放它?如果它崩溃了怎么办?我想知道在它崩溃的情况下,cleanup()不会被调用 我的清理工作应该一直在析构函数中吗?没有清理功能,除非我想在游戏中释放一些纹理 它说可以安全地将NULL传递给SDL\u FreeSurface(),我添加了NULL检查,但它还是崩溃了。我认为崩溃是因为我需要在SDL_FreeSurface()之后手动将sprite设置为NULL 这可能是不相关的
SDL\u FreeSurface(sprite)
失败,我会有漏洞吗?还是退出总是释放它?如果它崩溃了怎么办?我想知道在它崩溃的情况下,cleanup()
不会被调用
SDL\u FreeSurface()
,我添加了NULL检查,但它还是崩溃了。我认为崩溃是因为我需要在SDL_FreeSurface()之后手动将sprite设置为NULLclass 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();
}
类游戏{
公众:
#...
私人:
SDL_表面*屏幕;
SDL_表面*精灵;
};
Game::Game()
{
完成=错误;
sprite=NULL;
screen=NULL;
}
游戏::~Game()
{
如果(精灵!=NULL){
cout问题是清理后sprite
非空。更新的修复程序:
void Game::cleanup() {
SDL_FreeSurface(sprite);
sprite = NULL;
SDL_Quit();
}
你禁用复制构造函数了吗?(不应该与你的问题有关)代码在我看来很好,你需要一个For Game()?没有,但是上面的
main
中有充分的使用,所以我认为它不会影响它。我认为问题是SDL_FreeSurface()没有将指针设置为NULL,但我仍然想知道是否会发生崩溃。对于sscce,这几乎是全部源代码。除了在escape和flip screen时退出之外。哦!你是对的,这正是问题所在。SDL_FreeSurface
没有将指针设置为NULL
。(据我所知,没有释放函数能做到这一点,所以这是正常的行为。)我想把它作为一个答案发布出来?否则我们将作为一个傻瓜关闭它。