C# - 抛出异常时释放内存,大概没有最终阻塞

时间:2013-06-21 11:44:03

标签: c# exception memory throw finally

在我的C#app中,我在一些非常大的数组的初始化期间抛出自定义定义的异常。如何在抛出没有catch的Exceptions时抛出应用程序使用的所有内存,所以没有finally块,只是throw语句?或者在此上下文中抛出后可以执行finally块吗?

由于

2 个答案:

答案 0 :(得分:1)

如果您有本地阵列声明,那么您不需要关心它,因为GC将为您收集它。因此,如果您的代码看起来像这样:

int[] values = new int[100000];

// Some initialization here
throw new ApplicationException();
// Some initialization here
那么你不需要关心它。如果您的数组变量在处理异常时超出范围,或者之后它也将是GC,则同样适用于这种情况。如果你将它作为一个字段变量,可能会出现唯一的问题,因为它不会被GC本身(意味着将从其他地方引用它)或静态字段或类似物。如果你想确保清除它,你可以这样做:

try
{   
   m_Values = new int[100000];

   // Some initialization here
   throw new ApplicationException();
   // Some initialization here
}
catch // use this part if array should be used if there is no exception
{
   m_Values = null;
   throw;
}
finally // use this part if you never need an array afterwards
{
  m_Values = null;
}

因此,如果你使用这种模式,你可以确定没有对你的数组的引用,它将在某些时候被垃圾收集。您也可以强制GC收集它,但不建议这样做。

答案 1 :(得分:1)

您可以使用不带catch的try / finally语句。在这种情况下,无论是否抛出异常,都将执行finally块。

try{
    ...
    throw new Exception();
    ...
}
finally{
    //cleanup code
    ...
}