Утечка памяти в CF 3.5 - почему создаются экземпляры компонентов, а никогда не вызывается компонент. Добавление (...)? - PullRequest
0 голосов
/ 30 марта 2011

Я заметил утечку памяти в моем приложении 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 ]

1 голос
/ 30 марта 2011

Элементы управления являются компонентами, но не все компоненты являются элементами управления. Эта статья может предоставить полезную информацию. «Компоненты» IContainer предназначены для хранения любых неконтролируемых компонентов, которые должны быть утилизированы.

Элементы управления формы должны быть удалены через свойство 'Controls'. Где-то под вашим «фрагментом» вы должны увидеть код, похожий на

this.Controls.Add(this.lblName);
1 голос
/ 30 марта 2011

Это не утечка памяти.Ваша форма на самом деле не имеет поля components - оно только создается и используется во время разработки.

Вместо этого вы можете подумать о коллекции Controls вашей формы.Размещенный вами код был стандартным в .NET начиная с плейстоцена - вы действительно думаете, что Microsoft все эти годы будет пропускать что-то такое большое?

Если у вас есть утечка памяти (как вы это определили?),это почти наверняка результат не вызова Dispose() для всех объектов, для которых необходимо вызвать Dispose()..NET отлично справляется со сборкой мусора, но это не 100%.

...