ПроблемаОтмена назначения ранее освобожденного указателя происходит, когда блок памяти освобождается более одного раза с помощью 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 */
}