C# 循环中的内存泄漏

Dev*_*WAH 1 c# memory-leaks

public void DoPing(object state)
{
    string host = state as string;
    m_lastPingResult = false;
    while (!m_pingThreadShouldStop.WaitOne(250))
    {
        Ping p = new Ping();
        try
        {
            PingReply reply = p.Send(host, 3000);
            if (reply.Status == IPStatus.Success)
            {
                m_lastPingResult = true;
            }
            else
            {
                m_lastPingResult = false;
            }
        }
        catch
        {

        }
        numping = numping + 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

知道为什么这段代码会导致内存泄漏吗?我可以看到这段代码将等待值更改为更小或更大的值会增加内存使用率。有谁知道如何解决它?或者如何查看代码的哪一部分导致了它?

set*_*all 5

在某些垃圾收集语言中,存在一个限制:如果创建对象的方法仍未退出,则不会收集该对象。

\n\n

我相信 .net 在调试模式下是这样工作的。引用这篇文章;请注意粗体的声明。

\n\n

http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

\n\n
\n

当前正在运行的方法中的局部变量被视为 GC 根。这些变量引用的对象始终可以通过声明它们的方法立即访问,因此必须保留它们。这些根的生命周期取决于程序的构建方式。在调试版本中,只要方法位于堆栈上,局部变量就会持续存在。在发布版本中,JIT 能够查看程序结构,以计算出执行过程中变量可以被方法使用的最后一点,并在不再需要时将其丢弃。此策略始终使用\xe2\x80\x99t\n,并且可以关闭,例如,通过在调试器中运行\n 程序。

\n
\n