English 中文(简体)
.NET中一位建筑商的例外
原标题:
  • 时间:2009-05-29 14:46:19
  •  标签:

在我向像以下这样的建筑商提出例外时是否有任何记忆泄露?

class Victim
{
    public string var1 = "asldslkjdlsakjdlksajdlksadlksajdlj";

    public Victim()
    {
        //throw new Exception("oops!");
    }
}

垃圾收集器是否收集了未爆炸物品?

最佳回答

一般来说,从不泄露记忆的角度来看,这是安全的。 但是,如果你分配这种类型的未经管理的资源,将建筑商的例外情况排除在外是危险的。 举以下例子:

public class Foo : IDisposable { 
  private IntPtr m_ptr;
  public Foo() {
    m_ptr = Marshal.AllocHGlobal(42);
    throw new Exception();
  }
  // Most of Idisposable implementation ommitted for brevity
  public void Dispose() {
    Marshal.FreeHGlobal(m_ptr);
  }
}

每次你试图制造时,哪怕是使用一环,都会泄露记忆。 例如,这种泄漏记忆。

using ( var f = new Foo() ) {
  // Won t execute and Foo.Dispose is not called
} 
问题回答

如果你没有产生未经管理的资源,就应当对施工者的例外情况加以处罚。 然而,如果你确实在建筑商中制造了未经管理的资源,则该建筑商的整体,包括投掷石块,应划入一个审判/渔获物。 偷盗JardedPar大举:

public class Foo : IDisposable { 
  private IntPtr m_ptr;
  public Foo() {
    try
    {
        m_ptr = Marshal.AllocHGlobal(42);
        throw new Exception();
    }
    catch
    {
        Dispose();
        throw;
    }
  }
  // Most of Idisposable implementation ommitted for brevity
  public void Dispose() {
    Marshal.FreeHGlobal(m_ptr);
  }
}

现在的工作如下:

using ( var f = new Foo() ) {
  // Won t execute, but Foo still cleans itself up
}

是的,垃圾收集器将收回已经分配给该物体的管理资源。 如果你开始开发任何未管理的资源,你将需要以正常方式清理这些资源。

这取决于你在例外情况出现之前提出的其他资源。 我不认为在建筑商中出现例外是巨大的,但把他们扔到定稿者或处置者中的情况则更糟。





相关问题
热门标签