C#Disposable对象未处理但使用的内存不增加

时间:2014-09-26 15:57:29

标签: c# memory disposable

我创建了这个简单的C#程序,期望它抛出OutOfMemoryException。 问题是它没有使用我所有的笔记本电脑内存完美地工作为什么?如何让它泄漏所有内存?

static void Main(string[] args)
{
    for (int i = 0; true; i++)
    {
        new MustDispose();
    }
}


class MustDispose
{
    public MustDispose()
    {
        StreamReader r = null;
        r = File.OpenText("C:\\Users\\rverdelli\\Desktop\\asd.txt");
        if (r.EndOfStream) return;
        Console.WriteLine(r.ReadToEnd());
    }

}

2 个答案:

答案 0 :(得分:3)

循环的每次迭代都不会存储超出该迭代范围的任何状态,因此当它超过该迭代中分配的所有内存时,可以释放它。

如果你想耗尽内存,你需要抓住你正在分配的内存。

这是一个足够简单的示例,在运行内存时应该没有问题:

var data = Enumerable.Range(0, int.MaxValue)
    .Select(i => new int[int.MaxValue])
    .ToArray();
Console.WriteLine(data.Length);

答案 1 :(得分:3)

在您的方法MustDispose()中,有一个重要的字符:

}

这定义了范围的结束,这意味着局部变量不再有效。不再有效告诉垃圾收集器删除局部变量,特别是r以及所有甚至没有分配给变量的临时结果(即r.EndOfStream的布尔返回值和字符串r.ReadToEnd())。

吃掉所有记忆的可能性各不相同,例如

var keeper = new List<byte[]>();
while(true)
{
    keeper.Add(new byte[1024*1024]);
}

如果IDisposable interface is implemented correctly,Finalizer将检查是否已调用Dispose()。如果没有,Finalizer将会这样做。