C#-抛出异常时释放内存,可能没有finally块
本文关键字:finally 抛出异常 释放 内存 C#- | 更新日期: 2023-09-27 18:19:26
在我的C#应用程序中,我在初始化一些非常大的数组时抛出自定义的异常。当抛出没有catch的Exceptions时,我如何释放应用程序使用的所有内存,直到抛出异常,所以没有finally block,只有throw语句?或者在这种情况下,finally块可以在抛出之后执行吗?
感谢
如果您有一个本地数组声明,那么您不需要关心它,因为它将由GC为您收集。所以,如果你的代码看起来像这样:
int[] values = new int[100000];
// Some initialization here
throw new ApplicationException();
// Some initialization here
那么你就不需要关心它了。这同样适用于这样的情况,如果你的数组变量在处理异常时或之后超出范围,那么它也将是GC’ed。如果你把它作为类中的一个字段变量,而它本身不会被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收集它,但不建议这样做。
您可以使用不带catch的try/finally语句。在这种情况下,finally块将被执行,而不管是否抛出异常。
try{
...
throw new Exception();
...
}
finally{
//cleanup code
...
}