人々は、リリースされていないイベントリスナーが原因で発生するメモリリークについて話し続けています。これは非常に重要な問題だと思います。非常に深刻で非常に重要です...それが本当に存在する場合。
私は自分で問題を再現しようとしましたが、すべての試みが失敗しました:アプリケーションにメモリをリークさせることができません:(それは良い音ですが、私はまだ心配しています:何かが足りないかもしれません。
それで、誰かがメモリリークを引き起こす非常に単純なソースコードサンプルを提供できるでしょうか?
デモとして小さなVB.NETアプリケーションを作成しました。これには1つのWindowsフォームと1つのクラスが含まれています。
Windowsフォーム:コレクションオブジェクト(「c」という名前)と2つのボタンがあります。1つはコレクションに10個のアイテムを追加し、もう1つはコレクションをクリアします。
Public Class Form1
Dim c As New Collection
Private Sub btnAddItem_Click(sender As System.Object, e As System.EventArgs) Handles btnAddItem.Click
For i As Integer = 1 To 10
Dim m As New MyType
c.Add(m)
Next
Me.Text = c.Count
End Sub
Private Sub btnClear_Click(sender As System.Object, e As System.EventArgs) Handles btnClear.Click
For Each item As MyType In c
item.Dispose()
Next
c.Clear()
Me.Text = c.Count
End Sub
End Class
MyTypeクラス:大きなm_Imageオブジェクトがあります。これは大きいので、メモリが実際にMyTypeインスタンスによって使用されていることがわかります:)
Imports System.Drawing
Public Class MyType
Implements IDisposable
Private m_Image As Bitmap
Public Sub New()
AddHandler Application.Idle, AddressOf Application_Idle
m_Image = New Bitmap(1024, 1024)
End Sub
Private Sub Application_Idle(sender As Object, e As EventArgs)
End Sub
#Region "IDisposable Support"
Private disposedValue As Boolean
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
m_Image.Dispose()
End If
End If
Me.disposedValue = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class