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