2012-09-07 65 views
0

我有以下代碼:下面的代碼是否有內存泄漏?

Dictionary<string, Setup> dictSetups = new Dictionary<string, Setup>(); 
    Setup setup1 = new Setup(); 
    dictSetups.Add("setup1", setup1); 

    using (MySetupForm myForm = new MySetupForm()) 
    { 
     myForm.Setup = dictSetups["setup1"]; 
     if (myForm.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      dictSetups["setup1"] = myForm.Setup; 
     }     
    } 

這是MySetupForm

public partial class MySetupForm : Form 
    { 
     public MySetupForm() 
     { 
      InitializeComponent(); 
     } 

     public Setup Setup { get; set; } 
    } 

在上面的代碼我傳遞的dictSetups["setup1"]一個參考MySetupForm然後示出的形式。

如果對話框結果是OK我更新我的字典參考,我的問題是,當我外出使用的,這意味着MySetupForm myForm佈置,但

dictSetups["setup1"]是保持從myForm.Setup;參考,這樣纔有內存泄漏與否?

+0

什麼是myForm.Setup?它是一個字符串,對「Form」的引用,還是什麼? – Servy

+0

....aaaand這就是爲什麼我*討厭*託管語言。那些程序員是程序員的好時光,他們必須學會使用malloc和free ... – 2012-09-07 15:28:59

+0

@ H2CO3在我的日子裏,程序員用手敲出了1和0,我們很喜歡它。 – asawyer

回答

2

通過您發佈的代碼幾乎無法確定。

您應該掌握一個內存分析工具並分析您的應用程序。這是知道是否存在內存泄漏的唯一真正方法,它是什麼,以及解決問題的最佳方法。

+0

您可以100%確定發佈的代碼不會導致內存泄漏。 – Servy

+0

@Servy - 你知道字典在什麼範圍內定義,何時發佈表單和字典? –

+0

@Servy那是怎麼回事?我們甚至不知道'Dictionary dictSetups = new Dictionary ();'是一個局部變量還是一個字段。 – phoog

1

我會說,是的。這在代碼提供的代碼中有內存泄漏,。 我的意思是,Dictionary<string, Setup> dictSetups是全局變量,它在應用程序工作流程中保持其恆定的生命週期。

一般情況下,僅從代碼構成,從程序上下文來看,很難說。

+0

你還需要什麼信息? –

+0

內存泄漏是指當一個對象超出了範圍,從而阻止釋放其內存時,必須手動釋放內存的對象。這在C#中幾乎是不可能的,因爲垃圾回收器負責爲你回收內存。如果程序在不再需要時持有對具有大內存佔用空間的對象的引用,那麼該程序的內存效率可能會更低,但實際上它不是內存泄漏*。 – Servy

+0

@Servy我認爲在.NET垃圾收集器的上下文中「內存泄漏」意味着「在對象不再需要時保留對對象的引用,從而阻止它們的收集。」 – phoog

1

這裏沒有內存泄漏。

當你說dictSetups["setup1"] = myForm.Setup;你取的Setup對象myForm被引用和存儲在字典中參考。它沒有保留對myForm的引用。這將需要一個lambda或沿着這些線產生一個封閉的發生。

內存泄漏是指對象已超出範圍,從而阻止釋放其內存,因此必須手動釋放內存。這在C#中幾乎是不可能的,因爲垃圾回收器負責爲你回收內存。如果程序在不再需要時持有對具有大內存佔用空間的對象的引用,那麼該程序的內存效率可能會更低(我們無法確定是否在代碼中執行此操作;我們無法知道哪些對象實際上需要以後引用以及哪些對象會引用),但實際上它不是內存泄漏。

雖然可能導致在C#中的內存泄漏,這是真的。你實際上必須積極地試圖讓它發生在幾個狹窄的範圍之外。如果您正在處理非託管代碼,那麼您可能需要處理該代碼的內存管理,並且如果您處於不安全的塊中,可能會導致各種havok。不足之處在於,導致內存泄漏的可能性並不大。您通常無法在C#中分配垃圾回收器無法回收的內存,並且我知道沒有錯誤會阻止GC在回收內存時進行回收。