1

在我的 C# 应用程序中,我在一些非常大的数组的初始化期间抛出了自定义定义的异常。如何释放应用程序使用的所有内存,直到抛出异常时抛出异常而没有捕获,所以没有 finally 块,而只是 throw 语句?或者在这种情况下抛出后可以执行 finally 块吗?

谢谢

4

2 回答 2

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 收集它,但不建议这样做。

于 2013-06-21T11:58:05.463 回答
1

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

try{
    ...
    throw new Exception();
    ...
}
finally{
    //cleanup code
    ...
}
于 2013-06-21T12:17:15.130 回答