Dot-Net

從 .NET 中的建構子中拋出異常

  • November 10, 2011

當我從如下建構子中拋出異常時,是否存在記憶體洩漏?

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 塊,每次嘗試創建此類都會洩漏記憶體。例如,這會洩漏記憶體。

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

引用自:https://stackoverflow.com/questions/926362