SDL_FreeSurface(sprite)
プログラムを終了する前に呼び出しに失敗するとSDL_Quit()
、リークが発生しますか? それとも、終了すると常に解放されますか? クラッシュした場合はどうなりますか?クラッシュした場合、cleanup()
呼び出されないのではないかと思います。私のクリーンアップは常にデストラクタにある必要がありますか? ゲーム中にいくつかのテクスチャを解放したい場合を除き、クリーンアップ機能はありませんか?
に NULL を渡しても安全だと書かれており
SDL_FreeSurface()
、NULL チェックを追加しましたが、とにかくクラッシュします。クラッシュは、SDL_FreeSurface() の後で手動でスプライトを NULL に設定する必要があるためだと思いますか?無関係かもしれませんが (修正されていないようです)、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();
}