Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V3226. Potential resource leak. The...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V3226. Potential resource leak. The disposing method will not be called if an exception occurs in the 'try' block. Consider calling it in the 'finally' block.

02 Сен 2025

Анализатор обнаружил освобождение неуправляемого ресурса, которое может не произойти из-за выброшенного исключения.

Пример:

public void ProcessStreamReader(....)
{
  StreamReader sr = null;

  try
  {
    sr = new StreamReader(Console.OpenStandardInput(), Encoding.UTF8);

    string readString = sr.ReadLine();

    IO.WriteLine(readString);

    sr.Close();
  }
  catch (IOException exceptIO)
  {
    Console.WriteLine(exceptIO);
  }
}

В данном случае разработчик хотел вызвать метод Close для освобождения ресурсов, которые использует объект. Если в блоке try будет выброшено исключение, то метод не отработает, и ресурс не будет очищен.

Исправленный код может выглядеть следующим образом:

public void ProcessStreamReader(....)
{
  StreamReader sr = null;

  try
  {
    sr = new StreamReader(Console.OpenStandardInput(), Encoding.UTF8);

    string readString = sr.ReadLine();

    IO.WriteLine(readString);

    sr.Close();
  }
  catch (IOException exceptIO)
  {
    Console.WriteLine(exceptIO);
  }
  finally
  {
    if (sr != null)
    {
      sr.Close()
    }
  }
}

В исправленном варианте метод Close вызывается в блоке finally, поэтому метод будет вызван даже если в блоке try будет выброшено исключение.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как: