调用 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 代码的主要内容,如果未能解决你的问题,请参考以下文章

添加回调函数时 JavaScript 停止工作

WCF 突然停止工作

具有基本身份验证的 Exchange Online 和 EWS 停止工作

Yii2 ActiveForm 停止工作

升级到v141时sscanf是否停止工作?

在发送了很多之后,我的 send() 调用导致我的程序完全停止。这怎么可能?