DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Imageオブジェクトの破棄されるタイミングは?

環境/言語:[Windows XP, VB.NET2010]
分類:[.NET]

PanelコントロールのBackGroundImageに
下記のようなコードで描画を行おうとしています。
ボタンが押されたタイミングで何度も実行されるコードです。
Imageオブジェクトのごみがたまりそうな気がするのですが、
そんなことにはならないでしょうか?

++++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Sub GraphicDraw(ByVal typ As Integer)
dim img As New BitMap (250,250)
Dim sp As New Point(0, 0)
Dim ep As New Point(100, 100)
Dim g As Graphics = Graphics.FromImage(img)

g.DrawLine(Pens.Black, sp, ep)
g.Dispose()

frm.Pnl_Base.BackgroundImage = img

'img.Dispose()
'↑これを実行すると異常になる。

End Sub
++++++++++++++++++++++++++++++++++++++++++++++++++++++

毎回作られるimgが開放されずに居残る気がするのですが
大丈夫なのでしょうか。10000回ループで連続実行しても
大丈夫でしたが、なんとなく不安です。

ご意見よろしくお願いいたします。
■No31125に返信(SIFTさんの記事)
> 毎回作られるimgが開放されずに居残る気がするのですが
> 大丈夫なのでしょうか。10000回ループで連続実行しても
> 大丈夫でしたが、なんとなく不安です。
ガベージコレクションのヒットがたまたま良かっただけだと思います。
ImageはDisposeされた方が良いと思います。提示コードで行うなら
BackgroundImage に設定する前に前回オブジェクトを取得して
それに対しDisposeすると良いかと思います。
もしくは毎回Imageオブジェクトを作成せず上書きで描画してしまう
という方法もあるかと思います。
■No31126に返信(shuさんの記事)
> ImageはDisposeされた方が良いと思います。提示コードで行うなら
> BackgroundImage に設定する前に前回オブジェクトを取得して
> それに対しDisposeすると良いかと思います。
> もしくは毎回Imageオブジェクトを作成せず上書きで描画してしまう
> という方法もあるかと思います。

shuさんご意見ありがとうございます。
下記のような感じでよいでしょうか。
上書きの場合、[img = frm.Pnl_Base.BackgroundImage]と
すればよいと思いますが、既存の描画をクリアする方法は
あるのでしょうか?

+++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Sub GraphicDraw(ByVal typ As Integer)
Dim img As New BitMap (250,250)
Dim sp As New Point(0, 0)
Dim ep As New Point(100, 100)
Dim g As Graphics = Graphics.FromImage(img)

g.DrawLine(Pens.Black, sp, ep)
g.Dispose()

'追記
if ( isNothing ( frm.Pnl_Base.BackgroundImage = False ) then
frm.Pnl_Base.BackgroundImage.Dispose()
end if

frm.Pnl_Base.BackgroundImage = img

End Sub
+++++++++++++++++++++++++++++++++++++++++++++++++++++

DOBON.NET | プログラミング道 | プログラミング掲示板