【问题标题】:Opening SFML window gives memory read error打开 SFML 窗口会导致内存读取错误
【发布时间】:2014-01-24 19:22:14
【问题描述】:

我正在尝试打开一个 SFML 窗口,但每次启动它时都会显示“访问冲突读取位置:0xCCCCCCC0”。错误发生在 init() 方法中。相关代码:

class AirportGame {
private:
    sf::RenderWindow window;
public:
    void init();
    int run();

/

void AirportGame::init() {
    window.create(sf::VideoMode(800, 600), "SFML window");
}

int AirportGame::run() {
    init();

    while (window.isOpen()) {
        sf::Event event;

        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
        }
    }

    return 0;
}

int main() {
    AirportGame* app = new AirportGame();
    return app->run();
}

它发生在初始化之后的某个时间,因为实际的窗口是打开的。 0xCCCCCC0的调试器中没有提及。

【问题讨论】:

  • 你没有打开调试符号吗?你为什么要去mem地址?
  • 它们已打开,但我是说每个对象似乎都已正确定义,包括窗口。
  • yar,但它是一个运行时错误:P - 窗口应该是一个指针吗?
  • @FaddishWorm:SFML 并不神奇; C++ 是。
  • 告诉我们你在哪里创建AirportGame的实例,你正在调用run函数。

标签: c++ sfml


【解决方案1】:

修好了!

原来在 C++ 预处理器下我将定义设置为 SFML_STATIC 而不是 SFML_DYNAMIC

【讨论】:

    【解决方案2】:

    将窗口设置为 渲染窗口 *window;

    并用它创建它

    window = new sf::RenderWindow( /*your stuff or default initialize*/ );
    

    然后调用

    window->create( /*your settings*/ );
    

    如果你还没有初始化它。

    从那时起,只需使用“->”而不是“。”访问窗口

    【讨论】:

    • 是的,这就是我的意思。
    • 除非有充分的理由,否则永远不要使用new。为什么您认为堆分配会对这个问题产生任何影响?
    • 嗯,这是我一直使用的,而且效果很好。使用 new 问题不大,只要在完成后使用 delete。
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2017-10-24
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多