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();
这修复了内存泄漏
在您将此线程标记为重复之前,请考虑一下我已经尝试调试以下代码几天了,但似乎仍然找不到解决方案。
我正在使用具有一种 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();
这修复了内存泄漏