AForge相机内存泄漏在c#

本文关键字:泄漏 内存 相机 AForge | 更新日期: 2023-09-27 18:15:05

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

我正在研究一个camera类,它有一个公共方法:返回当前帧。在后台,每次新帧事件发生时,它都会更新当前帧(请参见下面的代码)。

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

我想我的问题是为什么this.currentFrame在增长?我正在使用Image.Clone()方法,所以没有其他任何东西应该引用它所引用的内存空间。此外,在我更新它之前,我让它参考null以防万一。那么,当this.currentFrame指针指向新的内存位置时,为什么不进行垃圾收集呢?

我怀疑AForge代码中有bug…我知道这可能是我代码中的小问题,但是我看不出来…

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();
}

AForge相机内存泄漏在c#

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

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

当我尝试在windows窗体应用程序中使用时,应用程序崩溃了,绘制了一个空引用错误的屏幕,在en中,我声明位图bmp作为全局变量,然后在cam_NewFrame上放置

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

修复内存泄漏