Invalid free of pointer

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

Описание

Этот дефект происходит, когда блок памяти выпустил использование 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++
Значение по умолчанию: On
Синтаксис командной строки: BAD_FREE
Удар: высоко
ID CWE: 404, 590, 762
Введенный в R2013b