Нужно ли делать dispose внутри функции для ее результата

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

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

karagota
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.11.2009 (Сб) 14:56

Нужно ли делать dispose внутри функции для ее результата

Сообщение karagota » 21.11.2009 (Сб) 15:10

Возникли проблемы с out of memory exception при работе с графикой. Видимо, потому, что не было освобождения ресурсов при создании объектов типа Bitmap, Brush и т.д. В других местах кода соответствующие строчки уже написаны, но в одном месте возникли два вопроса относительно функции, код которой приведен ниже.

1) Нужно ли писать g.dispose() для g (Dim g As Graphics) перед возвращением значения из функции getThumb? Не получится ли, что в результате высвобождения ресурсов функция вернет пустой результат (она возвращает thumb, а не g, но эти два объекта связаны каким-то не очень для меня понятным образом)
2) Где нужно освободить ресурсы для объекта thumb (As Bitmap), если этот объект является результатом, возвращаемым функцией getThumb? Если их освободить перед выходом из функции, то функция ничего не вернет. Если после выхода из функции - то не получится ли так, что функция возвращает копию объекта, а внутри нее память, занимаемая thumb, потеряется?


Код: Выделить всё
Private Function getThumb(ByVal Im As Bitmap) As Bitmap

        Dim tw, th, tx, ty As Integer
        Dim w As Integer = Im.Width
        Dim h As Integer = Im.Height
        Dim whRatio As Single = CType(w, Single) / CType(h, Single)
        If whRatio > 1 Then
            tw = Me.ImageList1.ImageSize.Width
            th = CType(CType(tw, Single) / whRatio, Integer)

        Else
            th = Me.ImageList1.ImageSize.Height
            tw = CType(CType(th, Single) * whRatio, Integer)

        End If


        tx = (Me.ImageList1.ImageSize.Width - tw) / 2

        ty = (Me.ImageList1.ImageSize.Height - th) / 2

        Dim thumb As Bitmap = New Bitmap(Me.ImageList1.ImageSize.Width, Me.ImageList1.ImageSize.Height)

        Dim g As Graphics = Graphics.FromImage(thumb)

        g.Clear(Color.White)

        g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic

        g.DrawImage(Im, New Rectangle(tx, ty, tw, th), New Rectangle(0, 0, w, h), GraphicsUnit.Pixel)
        'Нужно ли писать следующую строчку?
        g.Dispose()
        Return thumb

    End Function

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Нужно ли делать dispose внутри функции для ее результата

Сообщение Nord777 » 21.11.2009 (Сб) 15:19

1) Нужно ли писать g.dispose() для g (Dim g As Graphics) перед возвращением значения из функции getThumb?
Да.
Но можно так:
Код: Выделить всё
Using G As Graphics = Graphics.FromImage(thumb)
...
End Using


Если после выхода из функции - то не получится ли так, что функция возвращает копию объекта, а внутри нее память, занимаемая thumb, потеряется?
Не получится.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

karagota
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 21.11.2009 (Сб) 14:56

Re: Нужно ли делать dispose внутри функции для ее результата

Сообщение karagota » 22.11.2009 (Вс) 0:08

Большое Вам спасибо!


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

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

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

    TopList