0
  1. SDL_FreeSurface(sprite)プログラムを終了する前に呼び出しに失敗するとSDL_Quit()、リークが発生しますか? それとも、終了すると常に解放されますか? クラッシュした場合はどうなりますか?クラッシュした場合、cleanup()呼び出されないのではないかと思います。

  2. 私のクリーンアップは常にデストラクタにある必要がありますか? ゲーム中にいくつかのテクスチャを解放したい場合を除き、クリーンアップ機能はありませんか?

  3. に NULL を渡しても安全だと書かれており SDL_FreeSurface()、NULL チェックを追加しましたが、とにかくクラッシュします。クラッシュは、SDL_FreeSurface() の後で手動でスプライトを NULL に設定する必要があるためだと思いますか?

  4. 無関係かもしれませんが (修正されていないようです)、FAQ には次のように書かれています。

注: 可能であれば、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();
}
4

1 に答える 1

0

問題はsprite、クリーンアップ後に null ではないことでした。更新された修正:

void Game::cleanup() {
    SDL_FreeSurface(sprite);
    sprite = NULL;
    SDL_Quit();
}
于 2012-10-16T00:26:00.853 に答える