以下代码是否有内存泄漏?

时间:2012-09-07 15:23:46

标签: c#

我有以下代码:

    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;的引用,是否会造成内存泄漏?

3 个答案:

答案 0 :(得分:2)

您发布的代码几乎无法确定。

您应该掌握内存分析工具并分析您的应用程序。这是了解内存泄漏的唯一真正方法,它是什么,以及解决它的最佳方法。

答案 1 :(得分:1)

我会说,是的。这有内存泄漏,在提供的代码的上下文中。 我的意思是Dictionary<string, Setup> dictSetups是全局变量,它在应用程序工作流程期间保持其不变的生命周期。

一般来说,仅从提供的代码,从程序上下文的角度来看,很难说。

答案 2 :(得分:1)

此处没有内存泄漏。

当您说dictSetups["setup1"] = myForm.Setup;时,您正在获取Setup引用的myForm对象,并在字典中存储对 的引用。它没有保留对myForm的引用。需要在这些线上有一个lambda或其他东西来生成一个闭包。

内存泄漏是指对象已超出范围,从而阻止在必须手动释放内存的对象上释放内存。这在C#中几乎是不可能的,因为垃圾收集器负责为您回收内存。如果程序在不再需要的情况下持有对具有大内存占用量的对象的引用,那么该程序可能会降低内存效率(我们无法判断您是否在代码中执行此操作;我们无法知道你实际上需要什么对象以后引用哪些,你不会引用它们,但它实际上并不是内存泄漏。

虽然可能导致C#中的内存泄漏,但确实很难。你几乎必须积极地试图让它在一些狭窄的范围之外发生。如果您正在使用非托管代码,那么您可能需要处理该代码的内存管理,如果您处于不安全的区域,则可能会导致各种各样的问题。除此之外,没有太多可以做的事情导致内存泄漏。你通常不能在垃圾收集器无法回收的C#中分配内存,而且我知道没有任何错误阻止GC在应用时回收内存。