调用 SDL_Quit() 时“停止工作”的基本 SDL2 代码

Posted

技术标签:

【中文标题】调用 SDL_Quit() 时“停止工作”的基本 SDL2 代码【英文标题】:Basic SDL2 Code which "Stop working" when calling SDL_Quit() 【发布时间】:2014-06-04 07:49:12 【问题描述】:

所以我最近用 C++ 进入了 SDL2,我做了这个非常简单的代码:

int main(int argc, char** argv)


SDL_Event *event;
bool done = false;

if(SDL_Init(SDL_INIT_VIDEO) != 0)

    std::cerr << "Problèmes pour initialiser la SDL : " << SDL_GetError() << std::endl;
    return 1;

SDL_Window *window = 0;
window = SDL_CreateWindow("Mopion", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);

if(window == 0)

    done = true;


while(!done)

    while(SDL_PollEvent(event))
    
        switch(event->type)
        
        case SDL_QUIT:
            done = true;
            break;
        case SDL_KEYUP:
            if(event->key.keysym.sym == SDLK_q)
            
                done = true;
            
            break;
        default:
            break;
        
    

SDL_DestroyWindow(window);
SDL_Quit();

return 0;

虽然该代码起初执行得很好,但当我按下“Q”键时,窗口关闭,但我得到一个 Windows 错误窗口,提示“我的程序停止工作”。这不是很方便。

使用调试器,我发现在调用 SDL_Quit() 之前一切正常。

有人知道为什么会这样吗? 非常感谢!

【问题讨论】:

【参考方案1】:

您没有为您的 SDL_Event 保留内存,并且很可能正在破坏您的堆栈。将其声明为自动并通过地址将其传递给 SDL_PollEvent()。

【讨论】:

【参考方案2】:

您正在使用未初始化的指针:

SDL_Event *event;

您需要修复一些错误: 1、如果SDL_CreateWindow()返回0,则表示没有窗口,千万不要使用SDL_DestroyWindow()。 2. 你正在使用事件,所以你应该像这样调用SDL_Init()SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)

【讨论】:

以上是关于调用 SDL_Quit() 时“停止工作”的基本 SDL2 代码的主要内容,如果未能解决你的问题,请参考以下文章