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

使用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,提问作者שמואל ביאליסטוקי

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:55:16