1

我想使用 C# 创建内存泄漏,所以我编写了以下代码尝试创建一个。这个概念是编写一个显式的 Dispose ,它除了调用 GC.SuppressFinalize() 来阻止 GC 的工作之外什么都不做。但是当我运行代码时,它看起来好像内存没有泄漏。谁能帮忙告诉我为什么?

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            var t = new Foo();
            t.create_leak();
            t.Dispose();
        }
    }        
}
class Foo:IDisposable
{
    public void create_leak() {
        m_value = new int[10000];
        Console.WriteLine(m_value[10].ToString()+DateTime.Now.ToString());
    }

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

    private int[] m_value;

    ~Foo() { }
}
4

3 回答 3

3

这个概念是编写一个显式的 Dispose ,它除了调用 GC.SuppressFinalize() 来阻止 GC 的工作之外什么都不做。

GC.SuppressFinalize不会阻止 GC 的工作。它只是阻止 GC 调用对象的终结器。但托管内存仍将被回收。如果要创建内存泄漏,则需要分配非托管内存或以无法回收的方式分配托管内存(因为它会无限期地被引用)。字符串实习就是这样一种方式。编译的正则表达式是另一个(但是,一旦您的进程终止,该内存当然仍会被回收)。

于 2013-10-22T10:14:50.677 回答
3

这不是泄漏,因为Foo每个循环结束时仍然有资格收集;SuppressFinalizejust 意味着~Foo()不会被调用 - 它不会改变每个人m_value都有资格收集的事实。

很难得到真正的泄漏。如果您只想填充内存,请将所有Foo实例保存在 aList<T>或类似中 - 那么它们将永远没有资格被收集。对于真正的泄漏,您可能想要分配非托管内存——也许是Marshal.AllocHGlobal.

于 2013-10-22T10:16:41.230 回答
0

我建议您使用“位图”或“字体”之类的对象来产生内存泄漏。这些对象要求您显式处置它,否则可能导致内存泄漏。可以在这里找到一个例子:

连续创建位图会导致内存泄漏

于 2013-10-22T10:19:18.957 回答