例外和记忆

时间:2009-05-21 12:36:18

标签: c# exception exception-handling garbage-collection

抛出或遇到异常时:

void ThrowException()
{
    try
    {
        throw new Exception("Error");
    }
    catch
    {
    }
}

是&它是如何从记忆中消失的?

以上代码与Exception对象的内存处理有何不同以下代码?

void ThrowException()
{
    try
    {
        throw new Exception("Error");
    }
    catch(Exception e)
    {
    }
}

5 个答案:

答案 0 :(得分:7)

异常不会从IDisposable继承,因此不需要处理它。 内存释放由GC完成,就像所有.NET对象一样。

答案 1 :(得分:2)

Exception实例只是作为内存中的另一个对象 - 在catch方法之后,没有对该实例的任何剩余引用,因此它将在下一次垃圾收集扫描中被删除。

异常通常不会从IDisposable继承,因为实际上不应该有与Exception关联的外部资源。如果你。有一个IDisposable例外,你应该看看你的架构和&代码设计是正确的。

答案 2 :(得分:2)

简答。不要担心,垃圾收集器会这样做。

答案很长。 “忘掉”你所知道的有关内存管理的所有内容,并阅读Top 20 . net garbage collection articles

答案 3 :(得分:1)

当不再有任何对它的引用时,Exception类将被垃圾收集,垃圾收集器最终会转向。异常对象的处理方式与堆上分配的任何其他对象一样。

由于异常对象向上冒泡,当不再有方法捕获或将其抛到堆栈上方时,它将不再具有对它的引用。

两个示例都会产生相同的影响,因为它们都没有将异常提高,当方法返回时它将不再引用。

答案 4 :(得分:1)

由于异常没有实现IDisposable,因此垃圾收集器会像其他任何对象一样自动删除它们,因为它们不再被引用,因此您不必关心它们。只需实现一个示例类:

class CustomException : Exception {
    ~CustomException() {
        Console.WriteLine("Exception removed");
    }
}

class Program {
    static void Throw() {
        throw new CustomException();
    }
    static void Main(string[] args) {
        try {
            Throw();
        }
        catch {

        }
    }
}