Недопустимый свободный от указателя

Освобождение указателя без соответствующего динамического выделения

Описание

Недопустимый свободный от указателя происходит, когда блок памяти выпущенное использование функции free не был ранее выделен с помощью malloc, calloc или realloc.

Риск

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

Проблема может подсветить ошибки кодирования. Например, вы, возможно, хотели использовать функцию free или предыдущую функцию malloc на различном указателе.

Фиксация

В большинстве случаев можно устранить проблему путем удаления оператора free. Если указатель не является выделенной памятью от кучи с malloc или calloc, вы не должны освобождать указатель. Можно просто снова использовать указатель как требуется.

Если проблема подсвечивает ошибку кодирования, такую как использование free или malloc на неправильном указателе, исправьте ошибку.

Если проблема происходит, потому что вы используете функцию free, чтобы освободить память выделенный с оператором new, заменяете функцию free на оператор delete.

Примеры

развернуть все

#include <stdlib.h>

void Assign_Ones(void) 
{
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1; 
 
  free(p);   
  /* Defect: p does not point to dynamically allocated memory */
}

Указатель p освобожден с помощью функции free. Однако p указывает на ячейку памяти, которая не была динамически выделена.

Исправление — удаляет освобождение указателя

Если число элементов массива, p известен во время компиляции, одно возможное исправление, должно удалить освобождение указателя p.

#include <stdlib.h>

void Assign_Ones(void)
 {
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1;   
  /* Fix: Remove deallocation of p */
 }

Исправление — вводит выделение указателя

Если число элементов массива, p не известен во время компиляции, одно возможное исправление, должно динамически выделить память массиву p.

#include <stdlib.h>

void Assign_Ones(int num) 
{
  int *p;
  /* Fix: Allocate memory dynamically to p */
  p=(int*) calloc(10,sizeof(int)); 
  for(int i=0;i<10;i++)
     *(p+i)=1; 
  free(p); 
}

Проверяйте информацию

Группа: динамическая память
Язык: C | C++
Значение по умолчанию: на
Синтаксис командной строки: BAD_FREE
Влияние: высоко
ID CWE: 404, 590, 762

Введенный в R2013b