ПроблемаУдаление выделенного ранее указателя происходит, когда блок памяти освобождается более одного раза с помощью free
функция без промежуточного распределения.
РискКогда указателю выделяется динамическая память с malloc
, calloc
или realloc
, это указывает на место памяти на куче. Когда вы используете free
функция на этом указателе, связанный блок памяти освобождается для перераспределения. Попытка освободить этот блок памяти может привести к ошибке сегментации.
ЗафиксироватьИсправление зависит от первопричины дефекта. Посмотрите, намеревались ли вы выделить блок памяти указателю между первой деаллокацией и второй. В противном случае удалите вторую free
оператор.
Как хорошая практика, после освобождения блока памяти присвойте соответствующий указатель NULL. Перед освобождением указателей проверьте их на значения NULL и обработайте ошибку. Таким образом, вы защищены от освобождения уже освобожденного блока.
Пример - Отмена присвоения ранее отключенной ошибки указателя#include <stdlib.h>
void allocate_and_free(void)
{
int* pi = (int*)malloc(sizeof(int));
if (pi == NULL) return;
*pi = 2;
free(pi);
free (pi);
/* Defect: pi has already been freed */
}
Первый free
оператор освобождает блок памяти, который pi
относится к. Вторая free
оператор по pi
освобождает блок памяти, который уже был освобожден.
Коррекция - Удаление повторяющейся отмены присвоения
Одной из возможных коррекций является удаление второго free
оператор.
#include <stdlib.h>
void allocate_and_free(void)
{
int* pi = (int*)malloc(sizeof(int));
if (pi == NULL) return;
*pi = 2;
free(pi);
/* Fix: remove second deallocation */
}