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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:54:10