【发布时间】:2015-09-22 18:24:34
【问题描述】:
我正在使用 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)
...
【问题讨论】:
-
好吧,请告诉我,当你修复你的代码时它停止抱怨了吗?
-
@HansPassant 上面的代码是 Coverity 抱怨的。我认为那里实际上没有泄漏,但我不确定。我发现的 MSDN 示例没有任何 using 块 (link)。我倾向于将代码更改为更类似于该示例,但想在这个问题上做我的功课。目前,由于各种原因,我有大约 48 小时的延迟才能获得更新的 Coverity 结果。
标签: c# memory-leaks coverity