真正的 ManagementObject foreach 循环资源泄漏或误报?

Real ManagementObject foreach loop resource leak or false positive?

我正在使用 C# 中的 ManagementObjects 和 foreach 循环。 Coverity 声称在这样的代码中存在泄漏:

ObjectQuery myQuery = new ObjectQuery("Select * from Win32_Printer");
using (ManagementObjectSearcher mySearcher = new ManagementObjectSearcher(myQuery))
{
    // alloc_fn: A new resource is returned from allocation method Current.get
    // var_assign: Assigning: mo = resource returned from mo$iterator.Current
    foreach (ManagementObject mo in mySearcher.Get())
    {
        foreach (PropertyData p in mo.Properties)
        {
            // do stuff, maybe return a string
        }
    }
}
// leaked_resource: Returning without closing mo leaks the resource that it refers to
return "";

这是真漏还是误报?

这里甚至需要 using 块吗(这是我为避免泄漏而进行的最初尝试)?

我的想法是,这是一个实现了 IDisposable 的托管集合,调用者不应该负责销毁它。我之前看过以下建议的代码,但它似乎在使用更多 using 块的情况下走错了路:

...
    foreach (ManagementObject mo in mySearcher.Get()) using(mo)
...

ManagementObject 是一次性的,它没有在该代码中被处理。这就是警告的内容。这是一个真正的肯定。

集合 class (mySearcher.Get()) 也没有被处理,但它应该被处理。 Coverity 应该对此发出警告。

到目前为止,我只做了很少的 WMI,但似乎几乎所有东西都需要处理。一个讨厌的API。 Win32 大放异彩。

如果这是一个一次性程序,我根本不会担心任何一个。否则,您可能需要处理。