Каковы некоторые распространенные проблемы в приложении winform для утечек памяти? - PullRequest
0 голосов
/ 08 октября 2011

Я пытаюсь понять с помощью Ants Memory Profiler. У меня проблема в том, что у меня нет простого приложения с утечкой памяти.

Я использовал образец Redgate (QueryBee), но он был придуман для моего вкуса. Для этого должно быть более простое приложение.

Я пытался сделать один, но он не работает. Это не работает означает: у меня нет утечки памяти. Я читал, что вызов ShowDialog без утилизации вызываемой формы может привести к утечке памяти, но здесь это не так.

Я использую VS2010 и .NET 4.0

Меня особенно интересуют вопросы, которые очень распространены.

Вот что у меня пока есть. Можете ли вы дать мне утечку памяти?:

MainForm

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MemoryLeakTest
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SubForm formToCall = new SubForm();
            formToCall.ShowDialog();
        }
    }
}

Подформ

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace MemoryLeakTest
{
    public partial class SubForm : Form
    {


        public SubForm()
        {
            InitializeComponent();
        }

        private void SubForm_Load(object sender, EventArgs e)
        {

            ArrayList persons = new ArrayList();

            for (int i = 0; i <= 50000; i++)
            {
                var person = new {
                    Name = "1 SchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorsch",
                    LastName = "KluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluni", 
                    Age = 50,
                    City = "LondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondon",
                    Zip = "223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301", 
                    Index = i 

                };
                persons.Add(person);
            }

            dataGridView1.DataSource = persons;
        }

        private void SubForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            //this.Dispose();
        }


    }
}

1 Ответ

1 голос
/ 08 октября 2011

Добавьте это к вашей SubForm

public void mouse_handler(object sender, MouseEventArgs e)
{

}

И измените MainForm, чтобы сделать это

private void button1_Click(object sender, EventArgs e)
{
     SubForm formToCall = new SubForm();
     this.MouseClick += new MouseEventHandler(formToCall.mouse_handler);
     formToCall.ShowDialog();
}

Теперь не имеет значения, если вы .Dispose () SubForm или нет, у вас все еще будет «утечка». Ваша MainForm хранит ссылку на SubForms бесконечно через свой обработчик событий мыши, который в основном представляет собой просто список тех, кто должен получать события, поскольку этот обработчик никогда не отменяется.

Муравьи помогут вам отследить это, но скорее вручную, он покажет вам объекты, которые еще живы и на них есть ссылки из корня, и вы должны обнаружить, что на эти объекты нигде не следует ссылаться. Я считаю, что муравьи также могут генерировать предупреждения / и т.д. когда он находит объекты, которые были .Disposed (), но на которые все еще есть ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...