2009-04-21 18 views
2

在Windows Vista高級版上安裝我的程序後,出現以下異常。System.OutOfMemoryException:內存不足(GDI)

必須顯示的視圖包含以下控件: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) 

有人有同樣的問題?如何解決它?

回答

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處理)。

您的應用程序中的其他地方有可能泄漏手柄嗎?

+0

我使用Telerik的RadGridView在我的其他形式。 其他然後我使用的控制.net – Gerbrand 2009-04-21 09:57:24

1

可能有可能您僅在Vista中檢測到此項,因爲可用內存少於Windows XP的可用內存?如果機器的規格大致相同,那麼我會猜Vista的盒子會有更少的內存空間,因此會更快地突出內存泄漏的問題。

另一種可能是你試圖渲染太多,因爲調用堆棧指出有一個可滾動的控件,是否有可能渲染一堆實際上不可見的東西?

+0

我安裝程序上的WIN XP專業版和業務(沒有問題),在Vista終極也沒有問題。但Vista Premium - >給我那個錯誤 – Gerbrand 2009-04-21 09:57:55

0

您多久一次顯示此表單?這可能是窗口句柄(或缺少)的句柄問題。

我已經在包含帶有數百個控件的對話框的項目上工作,並且由於對話框沒有在使用後處置,所以存在內存/句柄問題。

爲了解決這個問題,他們最初在窗體第一次顯示時爲每個控件存儲了句柄,並且每次都重複使用它們。

在我看來,只要摧毀完成後不需要的東西,就會更容易,更簡單。

+0

這個表格只顯示一次,當程序啓動時他們需要在進入實際程序之前輸入登錄名。我們重新啓動了出現問題的計算機,現在程序啓動時沒有出現錯誤,我們可以在程序中工作。 – Gerbrand 2009-04-21 15:53:59

4

這不一定是一個OOM錯誤,GDI有拋出內存的習慣,只要它拋出一個異常。

引用微軟「GDI +喜歡在與內存無關的情況下返回OutOfMemoryExceptions」。一個討厭的小「特質」

here爲可以顯示細節