c#

时间:2015-09-29 08:51:42

标签: c# winforms memory-leaks aforge

在将此主题标记为重复之前,请考虑我已经尝试过几天调试以下代码,但似乎仍无法找到解决方案。

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

通过评论代码,我得出结论,这里发生了泄漏: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();
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

当我尝试在Windows窗体应用程序中使用该应用程序时,由于绘制空引用错误而导致屏幕崩溃,在en中,我将Bitmap bmp声明为全局变量,然后放在cam_NewFrame

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

这解决了内存泄漏