2016-05-29 2 views
-1

を用いここでは、コードスニペットは、次のとおりです。サブルーチン内Noの結果BITMAP

Dim BMf As Bitmap 
BMf = New Bitmap(PicBox.Width, PicBox.Height) 
Call FourierPlot(PlotHeight, PlotWidth, RPMArray, CoefArray, Count, 2, BMf) 
Me.PicBox.Image = BMf 
BMf.Dispose() 

のようなコードである:

Dim myGraphics As Graphics = Graphics.FromImage(BMf) 
Dim myPen As New Pen(colr) 
.... 
myGraphics.DrawLine(myPen, lastx, lasty, temp1, temp2) 
.... 
myPen.Dispose() 
myGraphics.Dispose() 

表示PicBoxが線で境界矩形から成る対角から引く(何

私が間違っていることについて何か提案(うまくいけば単純なもの)?

+1

あなたはそのDispose()呼び出しを後方に持っています。新しい画像ではなく*古い画像を破棄してください。したがって、Imageプロパティを割り当てる前に、If Me.PicBox.Image IsNot Nothing Then Me.PicBox.Image.Dispose()を使用してください。 –

答えて

0

画像は画像ボックスで使用されるため、BMf.Dispose()に電話をかけてはいけません。

更新:

OK、小さなアップデートこれはOPと他人に混乱しているように見えるので。

Me.PicBox.Image = BMfと言うときは、ビットマップへの参照を設定します。 BMfPicBox.Imageの両方が同じオブジェクトを指すようになりました。したがって、それを処分すべきではありません。なぜなら、それはもはや使用できないからです。再度 - これはコピーではありませんが、これは同じオブジェクトです。

そして、漏れについて。この行を削除しても、メモリやその他のリークは発生しません。 .NETがこれを管理しています。ビットマップが不要になると(つまり、誰も画像ボックスに別の画像をロードすることを誰も参照していないことを意味します)、ガベージコレクタの次の実行時には不要となります。これは自動的です。

リソースを本当に気にする必要がある場合は、手動で削除することができます。たとえば、コードを呼び出して新しいビットマップを頻繁に何度も作成する場合などです。しかし、この場合は、ガベージコレクタを強制的に実行して、ユーザにいくらか遅延させることができます。これは次のようにすることができます。

GC.Collect() 
+1

彼は何をすればいいのですか?あなたの答えは不完全です。 –

+0

彼はこの行を削除すべきです、これはむしろ明らかですか? – Arek

+0

ポインタの振る舞いが私をまっすぐにしてくれました。再度、あなたの助けをありがとう。 – GKMatthew

関連する問題