CF 3.5内存泄漏 - 为什么组件被实例化,但components.Add(...)从未调用过?

时间:2011-03-29 22:49:10

标签: c# winforms memory-leaks compact-framework

我注意到我的Compact Framework 3.5应用程序中存在内存泄漏,我想我已经发现了原因:组件永远不会添加到我的表单的IContainer components字段中。为什么Visual Studio 2008不添加每个组件,有没有办法解决这个问题?

//Form overrides dispose to clean up the component list.
[System.Diagnostics.DebuggerNonUserCode()]
protected override void Dispose(bool disposing)
{
    try {
        if (disposing && components != null) {
            // Components is disposed... but nothing was ever added to it!!!
            components.Dispose();

        }
    } finally {
        base.Dispose(disposing);
    }
}

//Required by the Windows Form Designer

private System.ComponentModel.IContainer components;
//NOTE: The following procedure is required by the Windows Form Designer
//It can be modified using the Windows Form Designer.  
//Do not modify it using the code editor.
[System.Diagnostics.DebuggerStepThrough()]
private void InitializeComponent()
{
    this.lblName = new System.Windows.Forms.Label();
    this.butNext = new System.Windows.Forms.Button();
    this.butPrev = new System.Windows.Forms.Button();
    this.butClose = new System.Windows.Forms.Button();
    this.butMore = new System.Windows.Forms.Button();
    this.SuspendLayout();
    //
    //lblName
    //
    this.lblName.Font = new System.Drawing.Font("Tahoma", 12f, System.Drawing.FontStyle.Bold);
    this.lblName.Location = new System.Drawing.Point(6, 38);
    this.lblName.Name = "lblName";
    this.lblName.Size = new System.Drawing.Size(373, 22);
    this.lblName.Tag = "Estimated Speed ({0})";
    this.lblName.Text = "Test";

            // ... SNIP ...
    }

2 个答案:

答案 0 :(得分:1)

这不是内存泄漏。您的表单实际上没有components字段 - 这只是在设计时实例化并使用。

您可能会考虑使用表单的Controls集合。你发布的代码自从更新世以来一直是.NET的标准 - 你真的认为微软这些年来会错过这么大的东西吗?

如果你确实有内存泄漏(你是如何确定的?),几乎可以肯定是在所有需要Dispose()调用它们的对象上调用Dispose()的结果。 .NET在垃圾收集方面做得很好,但不是100%。

答案 1 :(得分:1)

控件是组件,但并非所有组件都是控件。这个article可能会提供一些有用的背景知识。 '组件'IContainer用于存放任何必须处理的非控制组件。

表单的控件应通过“Controls”属性进行处理。在“剪辑”下方的某处,您应该看到类似于

的代码
this.Controls.Add(this.lblName);