System.OutOfMemoryException:内存不足(GDI)

时间:2009-04-21 09:35:35

标签: c# winforms

在windows vista premium上安装我的程序后,我遇到以下异常。

必须显示的视图包含以下控件:2个文本框,3个标签,一个按钮和链接按钮。

System.OutOfMemoryException: Out of memory.
   at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)
   at System.Windows.Forms.PaintEventArgs.get_Graphics()
   at System.Windows.Forms.Control.PaintException(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.OnPrint(PaintEventArgs e)
   at System.Windows.Forms.Control.WmPrintClient(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

有人有同样的问题吗?怎么解决?

4 个答案:

答案 0 :(得分:4)

这不一定是OOM错误,GDI习惯在抛出异常时抛出内存。

引用微软“GDI +喜欢在与内存无关的情况下返回OutOfMemoryExceptions”。一个讨厌的小'特质'

有关详细信息,请参阅here

答案 1 :(得分:3)

您的应用是否使用了您自己编写的任何自定义控件或控件?你能用一个非常简单的形式重新解决这个问题吗?

此...

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/4bc34266-edf9-430c-ad5a-c6e29392eb2d

......而这......

http://social.expression.microsoft.com/Forums/zh-CN/netfxbcl/thread/7c4d2e73-6e73-4f10-a614-13fd76b2f419

......似乎是一个类似的问题。但是,他们通常会讨论无法处置对象的自定义控件(因此,GDI会泄漏处理)。

你的app中的其他地方是否有可能泄漏处理?

答案 2 :(得分:1)

你可能只在Vista上检测到这个,因为可用内存少于Windows XP盒子上的可用内存吗?如果机器的规格大致相同,那么我猜想Vista盒子的内存可以更少,因此可以更快地突出显示内存泄漏的问题。

另一种可能性是你试图渲染太多,因为调用堆栈声明有一个可滚动的控件,你是否有可能渲染出一堆实际上看不到的东西?

答案 3 :(得分:0)

您多久都会显示此表单?它可能是窗口句柄(或缺少)的句柄问题。

我参与过包含数百个控件的对话框的项目,并且由于对话框在使用后没有处置,因此存在内存/句柄问题。

要解决这个问题,他们最初会在表单第一次显示时为表单上的每个控件存储句柄,并且每次都会重复使用它们。

在我看来,只要你完成就摧毁你不需要的东西会更容易和更简单。