使用windows-rs调用Windows API疑似内存泄漏问题求助
关于windows-rs crate疑似内存泄漏的问题
我是Rust新手,在使用windows runtime crate时,发现疑似内存泄漏问题。
运行以下核心代码:
use windows::Media::Control::GlobalSystemMediaTransportControlsSessionManager as SessionManager; fn main() { while true { let manager = futures::executor::block_on(SessionManager::RequestAsync().unwrap()).unwrap(); } }
内存占用每约5秒增长1MB!请问我是否存在操作错误?
更新: 我已在Windows runtime的GitHub项目中提交了Issue,原Issue内容为英文,现已翻译成中文。
问题分析与解决
你的代码存在操作不当的问题,内存持续增长的核心原因是在无限循环中反复创建GlobalSystemMediaTransportControlsSessionManager实例。
GlobalSystemMediaTransportControlsSessionManager是基于COM的Windows Runtime对象,windows-rs crate通过引用计数管理其生命周期。每次调用RequestAsync都会生成新实例,虽然循环结束后manager变量会离开作用域,但高频创建的COM对象可能无法被系统及时回收,导致内存累积。
更关键的是,这个对象本身设计为可复用——它会持续监听系统媒体会话的变化,完全不需要每次循环都重新创建。
修正后的代码
use windows::Media::Control::GlobalSystemMediaTransportControlsSessionManager as SessionManager; use std::time::Duration; fn main() { // 仅创建一次SessionManager实例 let manager = futures::executor::block_on(SessionManager::RequestAsync().unwrap()).unwrap(); while true { // 在这里执行需要的操作,例如获取当前媒体会话信息 // let sessions = manager.GetSessions().unwrap(); std::thread::sleep(Duration::from_secs(5)); } }
补充说明
如果确实存在需要重新获取实例的场景(比如系统媒体服务重启),也应该避免高频创建,同时可以通过显式调用drop(manager)触发对象释放,给系统留出垃圾回收时间。但绝大多数场景下,复用单个实例是最优解。
内容的提问来源于stack exchange,提问作者שמואל ביאליסטוקי
相关产品推荐
相关产品推荐

