Ловля IDisposables, которые никогда не выбрасываются - PullRequest
2 голосов
/ 07 марта 2011

Итак, как новый программист .NET я думал, что сборщик мусора навсегда уберет мой беспорядок.

Теперь, полтора года спустя, я получаю исключения из памяти в том коде, который я написал, когда я не знал, что мне нужно вызвать dispose на некоторых ресурсах. Я предполагаю, что это потому, что этот код выделяет много растровых изображений, которые не удаляются ...

Я прошел код, чтобы очистить их, теперь я знаю лучше. Но я продолжаю скучать по некоторым. Существует ли какой-либо инструмент или параметр, позволяющий увидеть, что IDisposables не удаляются?

Хотя я вижу, что простые случаи легко поддаются компиляции или инструменту, я также вижу некоторые более сложные сценарии, которые очень трудно отследить. Так что, если нет инструмента, который я понимаю, и буду продолжать делать это вручную.

Ответы [ 2 ]

5 голосов
/ 07 марта 2011

Посмотрите на FxCop. Одно из его правил будет отлавливать элементы, которые реализуют IDisposable, где Dispose() не был вызван.

1 голос
/ 07 марта 2011

Профилировщик памяти сможет показать вам, где все живые объекты данного класса были выделены - это может быть хорошей отправной точкой.

Некоторые профилировщики памяти теперь утверждают, что отслеживают пропущенные вызовы Dispose (), - я не знаю, насколько хорошо они работают.

...