C# 中的 AForge 相机内存泄漏

AForge Camera Memory Leak in c#

在您将此线程标记为重复之前,请考虑一下我已经尝试调试以下代码几天了,但似乎仍然找不到解决方案。

我正在使用具有一种 public 方法的相机 class:到 return 当前帧。在后台,每次发生新的帧事件时,它都会不断更新当前帧(请参见下面的代码)。

通过注释掉代码,我得出的结论是这里发生了泄漏:this.currentFrame = (Bitmap)eventArgs.Frame.Clone();。此外,我在 Visual Studio 中进行了一些内存性能诊断,似乎 this.currentFrame 对象的大小一直在增长(似乎与链表的行为相似)。

我想我的问题是为什么 this.currentFrame 增长了?我正在使用 Image.Clone() 方法,所以没有其他东西应该引用它所指的内存 space 。此外,在我更新它之前,我让它引用 null 以防万一。那么为什么当 this.currentFrame 指针指向一个新的内存位置时它没有被垃圾回收?

我怀疑 AForge 代码中存在错误...我知道这可能是我的代码中的一些小错误,但我看不到它...

public WebCamClass(VideoCaptureDevice camera)
{
    this.cam = camera;
    this.currentFrame = new Bitmap(Project.Properties.Resources.defaultImage);
    this.cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
    this.cam.Start();
}

private VideoCaptureDevice cam;
private Bitmap currentFrame;

private void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    this.currentFrame = null;
    this.currentFrame = (Bitmap)eventArgs.Frame.Clone();
}

public Image saveFrame()
{
    return this.currentFrame;
}

我也试过,但没有成功:

public Image saveFrame()
{
    return (Bitmap)this.currentFrame.Clone();
}

简单,你只需要使用"using",它会自动处理位图对象。

private void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
       using(Bitmap bmp = (Bitmap)eventArgs.Frame.Clone())
       {
          //your code using bmp object
       }
}

当我尝试在 windows 表单应用程序中使用时,应用程序在绘制屏幕时崩溃并出现空引用错误,在 en 中我将 Bitmap bmp 声明为全局变量,然后在 cam_NewFrame

if (bmp != null) bmp.Dispose();

这修复了内存泄漏