Память, выделяемая динамически, не освобождается
Этот дефект возникает, когда вы не освобождаете блок памяти, выделенный через malloc
, calloc
, realloc
, или new
. Если память выделена в функции, дефект не возникает, если:
В рамках функции вы освобождаете память, используя free
или delete
.
Функция возвращает указатель, назначенный malloc
, calloc
, realloc
, или new
.
Функция сохраняет указатель в глобальной переменной или в параметре.
Динамические функции выделения памяти, такие как malloc
выделите память на куче. Если вы не освобождаете память после использования, вы уменьшаете объем памяти, доступный для другого выделения. В встраиваемых системах с ограниченной памятью вы можете в конечном итоге исчерпать доступную память в куче даже во время выполнения программы.
Определите возможности, в которой осуществляется доступ к динамически выделенной памяти. Освободите блок памяти в конце этих возможностей.
Чтобы освободить блок памяти, используйте free
функция на указателе, который использовался во время выделения памяти. Для образца:
ptr = (int*)malloc(sizeof(int)); ... free(ptr);
Это хорошая практика - выделять и освобождать память в том же модуле на том же уровне абстракции. Например, в этом примере func
выделяет и освобождает память на том же уровне, но func2
не делает.
void func() { ptr = (int*)malloc(sizeof(int)); { ... } free(ptr); } void func2() { { ptr = (int*)malloc(sizeof(int)); ... } free(ptr); }
Группа: Динамическая память |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки: MEM_LEAK |
Влияние: Средний |
ИДЕНТИФИКАТОР CWE: 401, 404 |