Исключения и память - PullRequest
4 голосов
/ 21 мая 2009

При возникновении или возникновении исключения:

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

это и как он удаляется из памяти?

и чем вышеуказанный код отличается от приведенного ниже кода в отношении удаления из памяти объекта Exception?

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

Ответы [ 5 ]

7 голосов
/ 21 мая 2009

Исключение не наследуется от IDisposable, поэтому его не нужно удалять. Освобождение памяти выполняется GC, как и для всех объектов .NET.

2 голосов
/ 21 мая 2009

Краткий ответ. Не беспокойтесь, сборщик мусора сделает это.

Длинный ответ. «Забудьте» все, что вы когда-либо знали об управлении памятью, и прочитайте Top 20. чистый сборщик мусора

2 голосов
/ 21 мая 2009

Экземпляр Exception просто действует как другой объект в памяти - после метода catch нет никаких оставшихся ссылок на экземпляр, поэтому он будет удален в следующем цикле сбора мусора.

Исключения обычно не наследуются от IDisposable, так как на самом деле не должно быть внешних ресурсов, связанных с этим исключением. Если вы делаете . Если у вас есть исключение IDisposable, вам следует серьезно задуматься о правильности вашей архитектуры и кода.

1 голос
/ 21 мая 2009

Поскольку исключения не реализуют 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 {

        }
    }
}
1 голос
/ 21 мая 2009

Класс Exception будет собираться мусором, когда на него больше нет ссылок, а сборщик мусора в конечном итоге принимает ход. Объект исключения обрабатывается как любой другой объект, размещенный в куче.

Поскольку объект-исключение всплывает вверх, он больше не будет ссылаться на него, когда больше нет методов, которые перехватывают или выбрасывают его выше в стек.

Оба примера будут иметь одинаковый эффект, поскольку ни один из них не выбрасывает исключение выше, он выйдет из ссылки, когда метод вернется.

...