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

为何新增作用域会导致我的winit窗口崩溃?

为什么在独立作用域中创建winit窗口会导致崩溃?

你碰到的这个问题核心在于winit库中Window实例的生命周期必须至少覆盖EventLoop::run的执行全程,而Rust的作用域规则恰好决定了变量的销毁时机,两者结合就造成了崩溃。

咱们来拆解两段代码的差异:

  • 没加大括号的版本里,_window处于main函数的根作用域,它的生命周期会一直持续到event_loop.run()执行结束(毕竟run是阻塞调用,会一直停在这里处理事件直到退出),所以窗口能正常存活并响应事件。
  • 加上大括号后,_window被限制在了那个独立的小作用域里。程序执行完大括号里的代码后,Rust会自动销毁这个_window变量——也就是调用Window的析构函数,直接关闭窗口并释放所有相关资源。这时候再调用event_loop.run(),事件循环根本找不到可以处理事件的窗口,自然就崩溃了。

回到你的代码示例:当你取消注释大括号,_window的生命周期就被提前结束了。等事件循环开始运行时,对应的窗口已经不存在了,winit内部处理这种情况就会触发崩溃。

要修复这个问题很简单:确保Window实例的生命周期能覆盖event_loop.run()的整个执行过程。也就是把_window放在和event_loop.run()同一层或者外层的作用域里,别让它被提前析构就行。

内容的提问来源于stack exchange,提问作者frankenapps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:47:47