Предупреждение C6308

"realloc" может возвращать указатель null: назначение указателя NULL параметру name, который передается в качестве аргумента в "realloc", приведет к утечке исходного блока памяти.

Замечания

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

Имя анализа кода: REALLOCLEAK

Пример

В следующем примере кода создается предупреждение C6308. Эта проблема связана с назначением возвращаемого значения из reallocx. Если realloc завершается сбоем и возвращается пустой указатель, исходная память, на которую указывает x , не будет освобождена:

#include <malloc.h>
#include <windows.h>

void f( )
{
    char *x = (char *) malloc(10);
    if (x != NULL)
    {
        x = (char *) realloc(x, 512);
        // code...
        free(x);
    }
}

Чтобы устранить проблему, можно создать временную переменную для хранения возвращаемого reallocзначения. Это изменение позволяет безопасно освободить ранее выделенную память в случае realloc сбоя:

#include <malloc.h>
#include <windows.h>

void f()
{
    char *x = (char *) malloc(10);
    if (x != NULL)
    {
        char *tmp = (char *) realloc(x,512);
        if (tmp != NULL)
        {
            x = tmp;
        }
        // code...
        free(x);
    }
}

Это предупреждение может привести к возникновению шума, если в момент назначения результата функции перемещении буфера в режим реального времени существует динамический псевдоним.

Чтобы избежать таких проблем, используйте механизмы, предоставляемые стандартной библиотекой C++ (STL). К ним относятся, например, unique_ptrи контейнеры, такие как.shared_ptrvector Дополнительные сведения см. в разделе "Смарт-указатели " и "Стандартная библиотека C++".

См. также

Предупреждение C6014