Я работаю с элементами ManagementObjects и foreach в C#. Coverity заявляет, что существует утечка в коде, подобном этому:Реальная утечка ресурсов для объекта foreach реального или ложного срабатывания?
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)
...
Ну, молитесь, не переставали жаловаться, когда вы исправили свой код? –
@HansPassant Вышеупомянутый код - это то, о чем жалуется Coverity. Я не думаю, что там есть утечка, но я не уверен. Пример MSDN, который я нашел, не имеет каких-либо блоков ([link] (https://msdn.microsoft.com/en-us/library/ms186146 (VS.80) .aspx)). Я склонен изменить код, чтобы более точно походить на этот пример, но хочу сделать домашнее задание по этой проблеме. Прямо сейчас у меня около 48-часовой задержки, прежде чем я смогу получить обновленные результаты Покрытия по разным причинам. – PerryC