﻿# V701\. Possible realloc\(\) leak: when realloc\(\) fails to allocate memory, original pointer is lost\. Consider assigning realloc\(\) to a temporary pointer\.

Анализатор обнаружил в коде выражение вида 'foo \= realloc\(foo, \.\.\.\)'\. Данное выражение является потенциально опасным: рекомендуется результат функции realloc сохранять в другой переменной\.

Функция realloc\(ptr, \.\.\.\) производит изменение размера некоторого блока памяти\.  В случае, если размер блока памяти изменить удалось, не прибегая к перемещению данных, результирующий указатель совпадёт с исходным ptr\. В случае, если изменение размера блока памяти осуществить невозможно без его перемещения, функция вернёт указатель на новый блок памяти, а старый блок памяти будет освобождён\. Однако в том случае, если изменение размера блока памяти в данный момент вообще невозможно даже с перемещением, функция вернёт нулевой указатель\. Такая ситуация может возникнуть в случае выделения большого массива данных, размер которого сопоставим с размером ОЗУ компьютера, а также при сильной сегментации памяти\. Этот случай и является потенциально опасным: если realloc\(ptr, \.\.\.\) возвращает нулевой указатель, блок данных по адресу ptr не изменяет своего размера\. Главная проблема заключается в том, что при использовании конструкции вида "ptr \= realloc\(ptr, \.\.\.\)" указатель ptr на этот блок данных будет утерян\.

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

```cpp
void buffer::resize(unsigned int newSize)
{
  if (capacity < newSize)
  {
    capacity = newSize;
    ptr = (unsigned char *)realloc(ptr, capacity);
  }
}
```

Функция realloc\(\.\.\.\) производит изменение размера буфера в случае, если требуемый размер  буфера больше текущего\. Однако, что случится, если realloc\(\) не сможет выделить память? В результат ptr будет помещён NULL, что само по себе может привести к многочисленным проблемам, но более того: указатель на исходную область памяти будет утерян\. Корректный код будет выглядеть следующим образом: 

```cpp
void buffer::resize(unsigned int newSize)
{
  if (capacity < newSize)
  {
    capacity = newSize;
    unsigned char * tmp = (unsigned char *)realloc(ptr, capacity);
    if (tmp == NULL)
    {
      /* Handle exception; maybe throw something */
    } else
      ptr = tmp;
  }
}
```