在将此主题标记为重复之前,请考虑我已经尝试过几天调试以下代码,但似乎仍无法找到解决方案。
我正在使用一个公共方法的相机类:返回当前帧。在后台,它会在每次发生新帧事件时不断更新当前帧(请参阅下面的代码)。
通过评论代码,我得出结论,这里发生了泄漏: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();
}
答案 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();
这解决了内存泄漏