Почему ручки шрифтов не утилизируются? - PullRequest
2 голосов
/ 17 апреля 2009

Я использую GDIView , чтобы попытаться отследить источник нескольких устаревших дескрипторов GDI, и источником, кажется, являются шрифты, используемые в меню в форме. Единственный способ убедиться в том, что дескрипторы шрифтов являются GCed, - это явно установить для них значение null следующим образом:

tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;

Мне кажется, это не совсем правильно, но я не уверен, как еще решить эту проблему. Кто-нибудь еще сталкивался с этой проблемой раньше?

Ответы [ 3 ]

6 голосов
/ 17 апреля 2009

Несмотря на то, что лучше всего вызывать IDisposable.Dispose() самостоятельно, либо напрямую, либо используя ключевое слово using. Некоторые объекты GDI + являются исключением из этого правила.

GDI + содержит предопределенные кисти и ручки в классах кистей и ручек. Вы не должны вызывать Dispose() для объектов, возвращаемых членами этих классов (или других предварительно кэшированных объектов GDI, которые вы сами не создали new).

И заметка из MSDN - Font.Dispose:

Всегда вызывайте Dispose, прежде чем выпускать последнюю ссылку на шрифт. В противном случае используемые им ресурсы не будут освобождены, пока мусор сборщик вызывает метод Finalize объекта Font.

1 голос
/ 17 апреля 2009

Установка на ноль в конечном итоге приведет к их сборке мусора и вызову финализатора. Это может занять некоторое время, если нет памяти, объекты могут жить некоторое время.

System.Drawing.Font реализует IDisposable, поэтому вам следует вызвать Font.Dispose для детерминированного освобождения любых неуправляемых ресурсов (дескрипторов GDI).

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

0 голосов
/ 17 апреля 2009

Лучше всего, если класс реализует IDisposable, вы должны делать каждую попытку вызова Dispose для ваших экземпляров.

Большинство классов GDI поддерживают IDisposable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...