我注意到我的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 ...
}
答案 0 :(得分:1)
这不是内存泄漏。您的表单实际上没有components
字段 - 这只是在设计时实例化并使用。
您可能会考虑使用表单的Controls
集合。你发布的代码自从更新世以来一直是.NET的标准 - 你真的认为微软这些年来会错过这么大的东西吗?
如果你确实有内存泄漏(你是如何确定的?),几乎可以肯定是在所有需要Dispose()
调用它们的对象上调用Dispose()
的结果。 .NET在垃圾收集方面做得很好,但不是100%。
答案 1 :(得分:1)
控件是组件,但并非所有组件都是控件。这个article可能会提供一些有用的背景知识。 '组件'IContainer用于存放任何必须处理的非控制组件。
表单的控件应通过“Controls”属性进行处理。在“剪辑”下方的某处,您应该看到类似于
的代码this.Controls.Add(this.lblName);