Проблема утечки памяти - PullRequest
       18

Проблема утечки памяти

0 голосов
/ 06 апреля 2011

У меня тут быстрый вопрос.Может кто-нибудь из них посоветует мне…

Я обнаружил некоторую утечку памяти с некоторыми элементами управления, когда использую ее в следующем случае.Чтобы повторить это, я просто подготовил простое консольное приложение, чтобы проверить это.Когда я определяю разные классы как «MyClass» и «Class1» в качестве альтернативы одному и тому же объекту «a».Число экземпляров продолжает увеличиваться с каждым разом, а предыдущий экземпляр не удаляется.Об этом можно уведомить с помощью некоторого профилировщика, например «Ants Profiler», с помощью следующей процедуры репликации.

Подсказка: нажмите c, чтобы продолжить.Это назначит следующий объект.

[Фрагмент кода]

namespace ConsoleApplication3
{
    class Program : IDisposable
    {
        static void Main(string[] args)
        {
            object a;
            string s;

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");


                // Take a memory snap shot here.  We can see only one instance created for both class. 


                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                s = Console.ReadLine();
                if (s == "c")
                    a = new Class1();

                Console.WriteLine("a ===  Class1 ");
                s = Console.ReadLine();

                if (s == "c")
                    a = new MyClass();

                Console.WriteLine("a ==== MyClass");

                // Take a snap shot here multiple instance are created for both the class. 

            Console.WriteLine("End of the prog");

            Console.ReadLine();
        }

        public void Dispose()
        {
            GC.SuppressFinalize(this);

        }
    }
}

Пожалуйста, дайте мне знать, что это свойство свойства для определения класса.

Спасибо, Камаль.

Ответы [ 3 ]

4 голосов
/ 06 апреля 2011

Предыдущие экземпляры не будут удалены из памяти немедленно, когда вы назначите переменную новому экземпляру класса - экземпляры будут удалены, когда начнется сборка мусора. Поэтому я не думаю, что в этом коде есть утечка памяти.

Но - почему вы вызываете SuppressFinalize в методе Dispose программ?

2 голосов
/ 06 апреля 2011

Я думаю, что это не утечка памяти - GC будет собирать память через некоторое время, а не сразу. Так что на короткое время он все еще в памяти, и у вас есть несколько экземпляров.

0 голосов
/ 06 апреля 2011

Чтобы убедиться, что все ответы верны, принудительно выполните сборку мусора до получения второго снимка

GC.Collect();
GC.WaitForPendingFinalizers();
...