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()
不会被调用

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

  • 它说可以安全地将NULL传递给
    SDL\u FreeSurface()
    ,我添加了NULL检查,但它还是崩溃了。我认为崩溃是因为我需要在SDL_FreeSurface()之后手动将sprite设置为NULL

  • 这可能是不相关的,(似乎没有修复),但常见问题解答说:“您需要将SDL_INIT_noparatlege标志传递给对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();
    }
    
    类游戏{
    公众:
    #...
    私人:
    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
    。(据我所知,没有释放函数能做到这一点,所以这是正常的行为。)我想把它作为一个答案发布出来?否则我们将作为一个傻瓜关闭它。