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"]to的引用,MySetupForm然后显示了表单。

如果对话结果是OK我正在更新我的字典中的引用,我的问题是我什么时候不再使用该方法MySetupForm myForm,但是

dictSetups["setup1"] 持有来自 的引用myForm.Setup;,所以会不会是内存泄漏?

4

3 回答 3

2

通过您发布的代码几乎不可能确定。

您应该掌握一个内存分析工具并分析您的应用程序。这是了解是否存在内存泄漏、它在哪里以及修复它的最佳方法的唯一真正方法。

于 2012-09-07T15:26:17.743 回答
1

这里没有内存泄漏。

当您说dictSetups["setup1"] = myForm.Setup;您正在获取正在引用的Setup对象并将对该对象myForm的引用存储字典中时。它没有保留对myForm. 需要有一个 lambda 或类似的东西来生成一个闭包以实现这一点。

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

虽然在 C# 中可能会导致内存泄漏,但这真的很难。实际上,您必须积极尝试使其发生在几个狭窄范围之外。如果您正在与非托管代码进行互操作,那么您可能需要处理该代码的内存管理,并且如果您处于不安全的块中,您可能会导致各种破坏。除此之外,您实际上无法做太多事情来导致内存泄漏。您通常不能在 C# 中分配垃圾收集器无法回收的内存,而且我知道没有任何错误会阻止 GC 在应该回收内存时进行。

于 2012-09-07T15:31:46.657 回答
1

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

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

于 2012-09-07T15:27:15.483 回答