System.OutOfMemoryException

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

System.OutOfMemoryException

Сообщение ndemidov » 06.05.2008 (Вт) 14:55

Вот код из программы, который приводит к этой ошибки:

Код: Выделить всё
Dim fntTemp As New Font("Arial", 12)
SelectObject(MeDC, fntTemp.ToHfont)
TextOut(MeDC, 0, 0, "Font", 4)
fntTemp.Dispose()


Если делать это часто, то приведёт к OutOfMemoryException. Объясните пожалуйста в чём тут дело и как этого избежать. (Я только могу предположить, что при передаче fntTemp.ToHfont увеличивается ссылка на объект fntTemp и поэтому он не освобождается при GC.Collect.)

P.S. Прикрепляю демонстрационный пример, но скорее всего, после него придётся перезагружать компьютер :!:
Вложения
Example_Fonts.rar
OutOfMemoryException!
(46.31 Кб) Скачиваний: 75

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 06.05.2008 (Вт) 17:10

Не уверен... Но что если так?
Код: Выделить всё
hNew = fntTemp.ToHfont
hOld = SelectObject(MeDC, hNew )

...
SelectObject (MeDC, hOld)
DeleteObject hNew
label:
cli
jmp label

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Сообщение ndemidov » 06.05.2008 (Вт) 17:54

iGrok, всё работает! Спасибо. А fntTemp, помойму, можно не Dispose'ить?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 07.05.2008 (Ср) 11:47

А по-моему, не помешает..
Но опять же. Не уверен ))
label:
cli
jmp label


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 88

    TopList