You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SFML(C++)调用window.isOpen()触发读取访问违例错误求助

问题分析与解决方案

核心问题

触发0xC0000005读取访问违例的直接原因是**Game类的window指针未被正确初始化**,调用this->window->isOpen()时访问了空指针/野指针。

具体错误点

  1. 构造函数未执行初始化逻辑
    Game的构造函数为空,没有调用initializeVariable()和initWindow(),导致window成员始终处于未初始化状态(或为野指针),调用其成员函数必然触发内存访问错误。

  2. 窗口尺寸赋值错误
    initWindow()中连续两次给videoMode.height赋值,实际应该分别设置宽度和高度:

    // 原错误代码
    this->videoMode.height = 600;
    this->videoMode.height = 800;
    
  3. 内存泄漏风险
    用new创建的sf::RenderWindow未在析构函数中释放,会造成内存泄漏。


修正后的代码

Game.cpp 修正部分

// 构造函数:添加初始化调用
Game::Game()
{
    this->initializeVariable();
    this->initWindow();
}

// 析构函数:释放window内存
Game::~Game()
{
    delete this->window;
}

// 修正窗口尺寸赋值
void Game::initWindow()
{
    this->videoMode.width = 800;   // 改为设置宽度
    this->videoMode.height = 600;
    this->window = new sf::RenderWindow(videoMode, "Bioyy 2 ", sf::Style::Titlebar | sf::Style::Close);
}

额外建议

isRunnig()存在拼写错误,建议修正为isRunning()(不影响崩溃修复,但提升代码规范性)。


修复说明

  1. 构造函数调用初始化函数后,window会被正确赋值为sf::RenderWindow的实例指针,后续调用isOpen()、pollEvent()等成员函数时不会触发内存访问错误。
  2. 修正窗口尺寸赋值后,窗口会按预期的800x600大小创建。
  3. 析构函数中释放window内存,避免程序退出时的内存泄漏。

内容的提问来源于stack exchange,提问作者İbrahim Arif SAYKI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:04:55