Описание
Недопустимый свободный от указателя происходит, когда блок памяти выпустил использование 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);
}