内存泄漏问题

时间:2011-04-06 11:14:38

标签: c# .net wpf oop memory-leaks

我在这里有一个简单的问题。有人可以建议我......

当我在以下用例中使用它时,我发现一些内存泄漏了一些控件。为了复制这个,我刚刚准备了一个简单的控制台应用程序来检查它。当我将“MyClass”和“Class1”的不同类定义为同一个对象“a”时。每次实例的数量都会增加,并且前一个实例不会被处理掉。这可以通过使用某些Profiler(例如“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 个答案:

答案 0 :(得分:4)

当您将变量分配给新的类实例时,以前的实例不会立即从内存中删除 - 当垃圾收集开始时,实例将被删除。所以我认为此代码中没有内存泄漏。

但是 - 你为什么要在程序Dispose方法中调用SuppressFinalize?

答案 1 :(得分:2)

我认为这不是内存泄漏 - GC会在一段时间后收集内存,而不是立即收集内存。因此,在短时间内,它仍然在内存中,并且您的实例很少。

答案 2 :(得分:0)

要确保所有答案都正确,请在获取第二个快照之前强制进行垃圾回收

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