我在这里有一个简单的问题。有人可以建议我......
当我在以下用例中使用它时,我发现一些内存泄漏了一些控件。为了复制这个,我刚刚准备了一个简单的控制台应用程序来检查它。当我将“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);
}
}
}
请告诉我这是定义课程的属性行为。
由于 卡迈勒。
答案 0 :(得分:4)
当您将变量分配给新的类实例时,以前的实例不会立即从内存中删除 - 当垃圾收集开始时,实例将被删除。所以我认为此代码中没有内存泄漏。
但是 - 你为什么要在程序Dispose方法中调用SuppressFinalize?
答案 1 :(得分:2)
我认为这不是内存泄漏 - GC会在一段时间后收集内存,而不是立即收集内存。因此,在短时间内,它仍然在内存中,并且您的实例很少。
答案 2 :(得分:0)
要确保所有答案都正确,请在获取第二个快照之前强制进行垃圾回收
GC.Collect();
GC.WaitForPendingFinalizers();