在這裏和那裏,人們一直在討論由於未發佈的事件監聽器而發生的內存泄漏。我認爲這是非常重要的問題。非常認真和非常重要......如果它真的存在。.NET中由於事件處理程序而導致內存泄漏的示例?
我曾嘗試自己來重現問題,但我所有的努力都失敗了:我不能讓我的應用程序泄漏內存:( 雖然這聽起來不錯,我還是很擔心:也許我失去了一些東西
因此,也許有人可以提供
我創建了一個小VB.NET應用程序作爲演示一個非常簡單的源代碼示例,這會導致內存泄漏:它包含一個Windows窗體和一類
Windows窗體:它有一個集合對象(名爲「c」)和兩個按鈕:一個用於向colle添加10個項目ction和另一個清除集合:
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
它在某種程度上取決於您對內存泄漏的定義以及在什麼情況下。我們在談論一個Web應用程序或桌面應用程序嗎? – 2012-04-07 16:53:21
好吧,如果它有所作爲,最好查看兩種應用程序類型的代碼示例:桌面和網頁。 – Dima 2012-04-07 17:22:26