Real ManagementObject foreach循环资源泄漏还是误报?

时间:2015-09-22 18:24:34

标签: c# memory-leaks coverity

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

2015-09-22 13:22:18.574 addEventUI[33834:4374868] Add as {
NSFont = "<UICTFont: 0x7ae6bce0> font-family: \"Avenir-Book\"; font-weight: normal; font-style: normal; font-size: 14.00pt";
}Event 1{
NSFont = "<UICTFont: 0x7ae6bdd0> font-family: \"Avenir-Heavy\"; font-weight: bold; font-style: normal; font-size: 14.00pt";
}

这是真正的泄漏还是假阳性?

这里是否需要使用块(这是我最初尝试避免泄漏)?

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

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 "";

1 个答案:

答案 0 :(得分:1)

import re Spresence = [] with open('yourFile.txt') as FL: for line in FL.readlines()[1:]: m = re.match("\S+\s+\S+\s+\S+\s+(.*)", line) if m: Spresence+=re.split('\s+',m.group(1)) 是一次性的,并没有在该代码中处理。这就是警告的内容。这是一个真正的积极因素。

集合类(>>>Spresence ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '1', '0', '0', '2', '1', '1', '1', '0', '0', '3', '1', '1', '1', '0', '0', '4', '1', '1', '1', '0', '1', '2', '1', '1', '1', '0', '0'] )也没有被处理,但应该是。 Coverity应警告它。

到目前为止,我做的WMI很少,但似乎几乎所有东西都需要处理掉。一个令人讨厌的API。 Win32一闪而过。

如果这是一个抛弃计划,我根本不担心任何一个。否则,您可能需要处置。