Rust 程序中的内存泄漏

Tus*_*abh 3 windows performancecounter rust

我使用 windows-sys crate 编写了一个 Rust 程序,并收集所提供的查询的性能计数器值。我使用微软团队提供的示例程序(此处)。

该程序能够检索性能计数器值。然而,当我检查进程资源管理器以监视占用空间时,我注意到下面的私有字节图表。由于私有字节呈线性增加,因此表明存在内存泄漏。

在此输入图像描述

我无法使用 Windbg,因为 Windbg 无法连接到 Microsoft 符号服务器。因此,我决定通过注释代码并检查私有字节来手动识别问题的根源。相关代码如下——

fn execute_perf_query(input_query: &String,perf_query: &mut Vec<PerfEntryForMongo>)->f64{
    log::info!("Performing counter for  {:?}", input_query);

    let hostname = gethostname().into_string();
    
    unsafe {
        let mut query = 0;
        let p: *const u16 = std::ptr::null();
        
        PdhOpenQueryW(p, 0 as usize, &mut query);

    }

    return -1.0;
    //println!("Returning Now");
}
Run Code Online (Sandbox Code Playgroud)

请注意,目前我已注释掉与PdhAddCounterW、 、相关的代码PdhCollectQueryDataPdhGetFormattedCounterValue以了解每个 Windows 调用对私有字节的影响。

Vec<PerfEntryForMongo>每次迭代后都会被清除,因此不会导致内存泄漏。hostname是一个字符串,将在堆上分配,但是一旦范围结束,内存将被释放。

我正在使用原始指针,但它是一个 NULL 指针,不应在堆中分配任何内存。我需要了解什么导致内存泄漏。我已经介绍了与引用、借用和不安全 Rust 相关的章节,但我无法确定内存泄漏的原因。

pro*_*-fh 10

PdhOpenQueryW()调用将创建资源并更新query句柄。您需要使用 释放与此句柄关联的资源PdhCloseQuery()

因为所有这些都发生在一个unsafe块中,Rust 信任您,并且无法自行决定是否应该释放该资源。

每次调用该函数时,创建的资源都会泄漏。

  • 从技术上讲,memleak 也不是不安全的,因此安全性并不是这里真正需要考虑的因素。`window-sys` 是一个 -sys 包,其中大多数不添加 RAII 包装器,因此查询不会自动关闭。 (2认同)