使用SFML在main函数外操作文本时出现白屏崩溃的问题求助
使用SFML在main函数外操作文本时出现白屏崩溃的问题求助
看起来你遇到的是SFML中常见的字体生命周期管理问题,崩溃码-1073741819对应Windows的访问违规错误,本质是程序访问了已经被销毁的内存,我帮你梳理下代码里的关键问题:
1. 字体传值导致的悬空引用
SFML的sf::Text对象并不会复制它关联的sf::Font,而是持有对Font对象的引用。如果你的函数参数是传值(比如sf::Font font),函数内部会创建一个Font的临时副本,当函数执行完毕后这个副本会被销毁,此时Text对象引用的Font就变成了"悬空"的无效内存,后续绘制时就会触发崩溃。
你需要把所有传递Font的地方改成传引用:
- 修改
INFO_DISPLAY::render_info_text的参数:
void INFO_DISPLAY::render_info_text(sf::Font& font) // 这里加&改成引用 { object_info_label.setFont(font); object_info_label.setPosition(sf::Vector2f(0, 0)); object_info_label.setFillColor(sf::Color::Black); }
- 修改
MAIN_OVERLAY的构造函数参数:
MAIN_OVERLAY::MAIN_OVERLAY(sf::Font& font) // 同样改成引用 { ID.set_info_display_position(0.0f, 0.0f); ID.render_info_text(font); UI.set_user_interface_position(main_window_width - (UI.user_interface_width - 2), main_window_height - UI.user_interface_height); }
2. 重复加载字体的冗余代码
你在main里连续调用了两次txt_font.loadFromFile,这完全没必要,而且可能导致不必要的IO开销,改成如下简洁的写法即可:
sf::Font txt_font; if (!txt_font.loadFromFile("F:\\C++VS\\Rigid_Ball_Physics\\Rigid_Ball_Physics\\arial.ttf")) { throw("FAILED TO LOAD FONT"); }
3. 确认字体的生命周期
要保证main中的txt_font对象的生命周期长于所有使用它的Text对象,也就是txt_font要一直存在到程序结束(比如不要把它放在某个局部作用域里提前销毁),这样Text引用的Font才会始终有效。
修改完这些点后,再运行程序应该就能解决白屏崩溃的问题了。
备注:内容来源于stack exchange,提问作者Yubi
相关产品推荐
相关产品推荐

