Реальная утечка ресурсов цикла foreach ManagementObject или ложное срабатывание?
Я работаю с ManagementObjects и циклами foreach в C#. 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 "";
Это настоящая утечка или ложный положительный результат?
Блок использования вообще нужен здесь (это была моя первоначальная попытка избежать утечки)?
Я думаю, что это управляемая коллекция, которая реализует IDisposable, и вызывающая сторона не должна нести ответственность за ее уничтожение. Я видел следующий код, предложенный ранее, но кажется, что он движется по неверному пути с большим количеством блоков:
...
foreach (ManagementObject mo in mySearcher.Get()) using(mo)
...
1 ответ
ManagementObject
является одноразовым, и он не размещается в этом коде. Вот о чем предупреждение. Это настоящий позитив.
Класс коллекции (mySearcher.Get()
) тоже не утилизируется но так и должно быть. Coverity должен предупредить об этом.
Пока я сделал очень мало WMI, но, кажется, почти все нужно утилизировать. Неприятный API. Win32 просвечивает.
Если бы это была одноразовая программа, я бы ни о чем не беспокоился. В противном случае вам, вероятно, нужно избавиться.