【问题标题】:AForge Camera Memory Leak in c#c#中的AForge相机内存泄漏
【发布时间】:2015-09-29 08:51:42
【问题描述】:

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

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

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

我想我的问题是为什么this.currentFrame 会增长?我正在使用Image.Clone() 方法,所以没有其他东西应该指代它所指的内存空间。另外,在我更新它之前,我让它参考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();
}

【问题讨论】:

    标签: c# winforms memory-leaks aforge


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      这修复了内存泄漏

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2010-10-11
        • 1970-01-01
        • 2016-01-27
        • 2010-11-11
        • 2017-02-18
        • 1970-01-01
        相关资源
        最近更新 更多