【问题标题】:Access violation on program exit with Steamworks and SFMLSteamworks 和 SFML 程序退出时的访问冲突
【发布时间】:2019-03-03 14:55:00
【问题描述】:

同时使用 Steamworks 和 SFML 时程序退出时抛出异常: Exception thrown at 0x00007FFA919D024E (ntdll.dll) in Project1.exe: 0xC0000005: Access violation reading location 0x0000000000000010.

我已将程序缩减为最基本的程序,但仍然遇到问题:

#include <SFML/Graphics.hpp>
#include <steam/steam_api.h>

int main()
{
    SteamAPI_Init();

    sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "Title", sf::Style::Close);

    while (window.isOpen())
    {
        sf::Event e;
        while (window.pollEvent(e))
        {
            switch (e.type)
            {
                case sf::Event::Closed:
                {
                    window.close();
                    break;
                }
            }
        }
    }

    SteamAPI_Shutdown();

    return 0;
}

这是调用堆栈:

【问题讨论】:

  • 看起来像一个空指针取消引用。不知道为什么。
  • 我看到当您调用 SteamAPI_Shutdown() 时,sf::RenderWindow 对象变量“window”仍在范围内。换句话说,您已经交错初始化/取消初始化:1. 初始化蒸汽,2. 初始化窗口,3. 关闭蒸汽,4. 关闭窗口。我认为应该交换 3&4。只是一个疯狂的猜测,但是您是否尝试通过在窗口变量和 while 循环周围放置花括号来将其置于不同的范围内,以将蒸汽(反)初始化保持在外部?
  • 感谢您的建议,但很遗憾这不起作用。

标签: c++ sfml steamworks-api


【解决方案1】:

事实证明,解决方案非常简单,只需将 Steamworks API 初始化移至创建窗口之后即可。

#include <SFML/Graphics.hpp>
#include <steam/steam_api.h>

int main()
{
    sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "Title", sf::Style::Close);

    SteamAPI_Init();

    while (window.isOpen())
    {
        sf::Event e;
        while (window.pollEvent(e))
        {
            switch (e.type)
            {
                case sf::Event::Closed:
                {
                    window.close();
                    break;
                }
            }
        }
    }

    SteamAPI_Shutdown();

    return 0;
}

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多