.net - 从 .NET 中的构造函数中抛出异常

标签 .net exception memory garbage-collection

当我从如下构造函数中抛出异常时是否存在内存泄漏?

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 block ,每次您尝试创建该类都会泄漏内存。例如,这会泄漏内存。

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

关于.net - 从 .NET 中的构造函数中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/926362/

相关文章:

c# - 在并发数据库更新时锁定 Entity Framework 代码

C# - 第二个参数等于字符串长度的字符串 IndexOf 方法

c# - 无法在我的 WPF 应用程序中读取 True Type 字体文件!

exception - Slick2D可运行 jar (JarSplice)找不到声音 Assets ? “Resource not found”错误

c - 浮点异常(核心转储)

c++ - C++中异常属于线程还是进程?

c# - 为什么拆箱比装箱快 100 倍

c# - Windows形成不同的类,试图改变textbox.text

Android WebView Assets 引用内存泄漏

c++ - 为什么内存地址以 0x 开头?