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();
}
很简单,你只需要使用"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();
修复内存泄漏