SFML(C++)调用window.isOpen()触发读取访问违例错误求助
问题分析与解决方案
核心问题
触发0xC0000005读取访问违例的直接原因是**Game类的window指针未被正确初始化**,调用this->window->isOpen()时访问了空指针/野指针。
具体错误点
构造函数未执行初始化逻辑
Game的构造函数为空,没有调用initializeVariable()和initWindow(),导致window成员始终处于未初始化状态(或为野指针),调用其成员函数必然触发内存访问错误。窗口尺寸赋值错误
initWindow()中连续两次给videoMode.height赋值,实际应该分别设置宽度和高度:// 原错误代码 this->videoMode.height = 600; this->videoMode.height = 800;内存泄漏风险
用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()(不影响崩溃修复,但提升代码规范性)。
修复说明
- 构造函数调用初始化函数后,
window会被正确赋值为sf::RenderWindow的实例指针,后续调用isOpen()、pollEvent()等成员函数时不会触发内存访问错误。 - 修正窗口尺寸赋值后,窗口会按预期的800x600大小创建。
- 析构函数中释放
window内存,避免程序退出时的内存泄漏。
内容的提问来源于stack exchange,提问作者İbrahim Arif SAYKI
相关产品推荐
相关产品推荐

