gpt4 book ai didi

.net - .NET 中由于事件处理程序导致内存泄漏的示例?

转载 作者:行者123 更新时间:2023-12-03 02:49:58 24 4
gpt4 key购买 nike

人们一直在谈论由于未释放的事件监听器而发生的内存泄漏。我认为这是一个非常重要的问题。非常严肃,非常重要......如果它真的存在的话。

我尝试自己重现该问题,但所有尝试都失败了:我只是无法让我的应用程序泄漏内存:(虽然听起来不错,但我仍然担心:也许我错过了一些东西。

那么也许有人可以提供一个非常简单的导致内存泄漏的源代码示例?

我创建了一个小型 VB.NET 应用程序作为演示:它包含一个 Windows 窗体和一个类。

Windows 窗体:它有一个集合对象(名为“c”)和两个按钮:一个用于向集合中添加 10 个项目,另一个用于清除集合:

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

最佳答案

这是一个非常简单的例子

class MyType
{
public static event EventHandler ExampleEvent;

public MyType()
{
ExampleEvent += (sender, e) => OnExampleEvent();
}
private void OnExampleEvent() { }
}

MyType 的任何实例都将订阅 ExampleEvent 事件。该事件不附加到任何特定对象,因此它永远不会离开内存。这将在应用程序运行期间将所有 MyType 实例保存在内存中。

编辑

正如评论中所要求的,这是 MyType 实例在不再使用后仍保留在内存中很长时间的演示

class Program
{
static void Main(string[] args)
{
WeakReference weakRef = new WeakReference(new MyType());
for (var i = 0; i < 10; i++)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}

Console.WriteLine("Still Alive: {0}", weakRef.IsAlive);
}
}

关于.net - .NET 中由于事件处理程序导致内存泄漏的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10056232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com